在实体框架6中处理规范化数据

本文关键字:处理 规范化 数据 实体 框架 | 更新日期: 2023-09-27 18:15:36

假设我有这两个实体,一个Account实体有一个Address。

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. 提示用户,让他们知道这个地址在5个地方被使用,并让他们指定是要更改全部还是只更改这一个(更多的工作)。
  3. 仅更改此特定帐户的地址,因此意味着我们现在在数据库存储中持久化了2个不同的地址,一个是新的,一个是现在在4个地方使用的旧地址。

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

一旦确定了工作流,如何实现它。例如,以上面的情形1为例。要实现更改,我必须执行以下操作:

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

    。[If Exists] -获取已存在的Id,设置Account。AddressId = foundId
    b. [If不存在]-使用实例化对象并分配,Account。Address = newAddress,然后. savechanges()和一个新的地址记录将被输入数据库。

. .看起来工作量很大,但也许就是这样。

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

. .更多的工作,但是,也许它就是这样。

我在这里错过了什么,似乎这样的事情应该更容易做使用ORM。

在实体框架6中处理规范化数据

当地址被更改(编辑)时,它应该是为了更正地址,所以它应该只在一个地方改变,并反映在它被引用的所有地方。这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;}
}

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

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