gpt4 book ai didi

entity-framework - 从聚合根中删除一个 child

转载 作者:行者123 更新时间:2023-12-04 07:23:19 29 4
gpt4 key购买 nike

我有一个通用存储库,可以添加更新删除。我们将其命名为 CustomerRepository

我有一个名为 Customer 的实体 (POCO),它是一个聚合根,具有 Addresses

public class Customer
{
public Address Addresses { get; set; }
}

我处于分离 Entity Framework 5 场景中。

现在假设我拿到客户后,选择删除一个客户地址。我通过 Update 方法将 Customer 聚合根提交到存储库。

如何保存对地址所做的修改?

  1. 如果地址 id 为 0,我可以认为该地址是新地址。
  2. 对于地址的其余部分,我可以选择附加所有地址,无论如何都将其标记为已更新。
  3. 对于已删除的地址,我看不到解决方法...

我们可以说这个解决方案是不完整和低效的。

那么应该如何更新聚合根子节点?

我是否必须使用 AddAddressUpdateAddressDeleteAddress 等方法来完成 CustomerRepository

虽然它似乎会打破这种模式......

我是否在每个 POCO 上放置一个 Persistence 状态:

public enum PersistanceState
{
Unchanged,
New,
Updated,
Deleted
}

然后在我的 CustomerRepository 中只有一个方法,保存

在这种情况下,我似乎正在重新发明实体“非 POCO”对象,并将数据访问相关属性添加到业务对象......

最佳答案

首先,您应该使用 Add、Update 和 Delete 方法保留您的存储库,尽管我个人更喜欢添加、索引器集和删除,这样存储库看起来就像应用程序代码的内存集合。

其次,存储库应该负责跟踪持久性状态。我什至不会用

弄乱我的域对象
object ID { get; }

就像有些人一样。相反,我的存储库如下所示:

public class ConcreteRepository : List<AggregateRootDataModel>, IAggregateRootRepository

AggregateRootDataModel 类是我用来跟踪内存中对象的 ID 以及跟踪任何持久性信息的类。在你的情况下,我会把属性放在

List<AddressDataModel> Addresses { get; }

在我的 CustomerDataModel 类上,该类还将包含 Customer 域对象以及客户的数据库 ID。然后,当客户更新时,我会有如下代码:

public class ConcreteRepository : List<AggregateRootDataModel>, IAggregateRootRepository
{
public Customer this[int index]
{
set
{
//Lookup the data model
AggregateRootDataModel model = (from AggregateRootDataModel dm in this
where dm.Customer == value
select dm).SingleOrDefault();
//Inside the setter for this property, run your comparison
//and mark addresses as needing to be added, updated, or deleted.
model.Customer = value;
SaveModel(model); //Run your EF code to save the model back to the database.
}
}
}

此方法的主要警告是您的域模型必须是引用类型,并且您不应覆盖 GetHashCode()。这样做的主要原因是,当您执行匹配数据模型的查找时,哈希码不能依赖于任何可变属性的值,因为即使应用程序代码修改了值,它也需要保持不变域模型实例的属性。使用这种方法,应用程序代码变为:

IAggregateRootRepository rep = new ConcreteRepository([arguments that load the repository from the db]);
Customer customer = rep[0]; //or however you choose to select your Customer.
customer.Addresses = newAddresses; //change the addresses
rep[0] = customer;

关于entity-framework - 从聚合根中删除一个 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13861412/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com