假设我有这两个实体,而且一个账户实体有一个地址。
public class Address
{
public int Id { get; private set; }
public string Address1 { get; private set; }
public string Address2 { get; private set; }
public string Address3 { get; private set; }
public int PostalCodeId { get; private set; }
public virtual PostalCode PostalCode { get; private set; }
}
public class PostalCode
{
public int Id { get; set; }
public string ZipCode { get; set; }
}
我正在使用CQRS,并且有一个命令可以更改地址。
public bool ChangeAddress(int addressId, string line1, string line2, string line3, string zipCode)
{
//do something here....
}
我正在努力解决这个问题。由于我们已经标准化了数据,因此可以在5个地方使用被更改的地址。我们可以在这里应用3个工作流程。
- 只需更改地址,即所有5个地方都将使用更新的地址。
- 提示用户,让他们知道这个地址在5个地方使用,让他们指定是想要改变全部还是只改变这个(更多的工作)。
- 只更改此特定帐户的地址,这意味着我们现在在db存储中保留了2个不同的地址,新的地址和现在在4个地方使用的旧地址。
醇>
首选工作流程是什么(是的,我知道没有正确的答案,我想知道通常会做什么)?
确定工作流程后,如何实施。例如,从上面看案例1。要实施更改,我必须执行以下操作:
- 使用方法的参数在代码中实例化地址对象。
- 查看数据库以查看该地址是否存在。
醇>一个。 [如果存在] - 获取现有ID,设置Account.AddressId = foundId
湾[如果不存在] - 使用实例化对象并分配,Account.Address = newAddress,然后.SaveChanges()和新地址记录将输入数据库。
..似乎很多工作,但也许它就是它的本质。
此外,如果用户只更改他们正在更改的地址上的邮政编码,该怎么办?我需要首先查看数据库中是否存在“新”数据,然后使用其id。如果它不存在,则在代码中实例化一个新对象。 id将为0,因此EF设置EntityState.Inserted .SaveChanges()将在表中放置一条新记录。然后......我必须查找旧的,如果它不再在任何地方使用,请将其从数据库中删除。
..更多的工作,但又一次,也许它就是它的本质。
我在这里遗漏了一些东西,看起来这样的事情应该更容易使用ORM。
答案 0 :(得分:1)
当地址被更改(编辑)时,它应该用于校正地址,因此它应该只在一个地方改变并反映在所引用的任何地方。它应该在所有这5个地方改变。如果它是一个人独有的东西,比如电子邮件地址可能是,那么它就不会出现在另一个表(实体)上。
根据需要,可以将其建模为1对1,1对多对或多对多。
class Person
{
public Address Address {get;set;}
}
class Person
{
public virtual ICollection<Address> Addresses {get;set;}
}
class Address
{
...
}
//or
class Address
{
...
public virtual ICollection<Person> People {get;set;}
}
答案 1 :(得分:0)
地址几乎不会改变。相反,实体(个人,企业,等等)可能会移动到与当前注册的地址不同的地址。
所以不,你不应该希望用户能够编辑地址。您可以让他们将实体链接到新的或不同的地址。