使用Entity Framework 6中的规范化数据?

时间:2015-10-01 15:26:40

标签: c# entity-framework-6

假设我有这两个实体,而且一个账户实体有一个地址。

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个工作流程。

  
      
  1. 只需更改地址,即所有5个地方都将使用更新的地址。
  2.   
  3. 提示用户,让他们知道这个地址在5个地方使用,让他们指定是想要改变全部还是只改变这个(更多的工作)。
  4.   
  5. 只更改此特定帐户的地址,这意味着我们现在在db存储中保留了2个不同的地址,新的地址和现在在4个地方使用的旧地址。
  6.   

首选工作流程是什么(是的,我知道没有正确的答案,我想知道通常会做什么)?

确定工作流程后,如何实施。例如,从上面看案例1。要实施更改,我必须执行以下操作:

  
      
  1. 使用方法的参数在代码中实例化地址对象。
  2.   
  3. 查看数据库以查看该地址是否存在。      
        

    一个。 [如果存在] - 获取现有ID,设置Account.AddressId = foundId
        湾[如果不存在] - 使用实例化对象并分配,Account.Address = newAddress,然后.SaveChanges()和新地址记录将输入数据库。

      
  4.   

..似乎很多工作,但也许它就是它的本质。

此外,如果用户只更改他们正在更改的地址上的邮政编码,该怎么办?我需要首先查看数据库中是否存在“新”数据,然后使用其id。如果它不存在,则在代码中实例化一个新对象。 id将为0,因此EF设置EntityState.Inserted .SaveChanges()将在表中放置一条新记录。然后......我必须查找旧的,如果它不再在任何地方使用,请将其从数据库中删除。

..更多的工作,但又一次,也许它就是它的本质。

我在这里遗漏了一些东西,看起来这样的事情应该更容易使用ORM。

2 个答案:

答案 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)

地址几乎不会改变。相反,实体(个人,企业,等等)可能会移动到与当前注册的地址不同的地址。

所以不,你不应该希望用户能够编辑地址。您可以让他们将实体链接到新的或不同的地址。