【问题标题】:How to update a object that contains a collection of other objects in c# in ado.net?如何在 ado.net 中更新包含 c# 中其他对象集合的对象?
【发布时间】:2011-12-22 16:28:57
【问题描述】:

我有一个客户实体。我的客户实体有一组与我的给定实体相关的地址值对象。如果客户添加了一个新地址,当我将它传递回存储库进行更新时,我的存储库如何知道要添加的新地址是哪个?我正在使用普通的 ado.net。

public class Customer
{
    public List<Address> Addresses { get; set; }
}
public class CustomerRepository
{
    public bool Update(Customer customer)
    {
        //Update logic.
    }
}

【问题讨论】:

  • 您使用的是实体框架还是原始 ADO.NET?
  • 快照。比较执行状态更改前后的状态并得出意图(不好,但您的选择)。

标签: c# ado.net domain-driven-design repository


【解决方案1】:

事实是它很复杂,这就是为什么应该使用 ORM(EntityFramework、NHibernate 等)而不是重新发明轮子。

我认为您可以做的最简单的事情是让您的实体实现 INotifyPropertyChanged 并使您的存储库订阅 PropertyChanged。然后,您可以跟踪已更改的对象及其属性,因此您也可以创建所需的更新。

此外,如果您的集合是 ObservableCollection,您将能够跟踪是否添加了项目(并进行正确的插入),是否删除了某个对象(如果将其移动到另一个对象,则进行正确的删除或更新,取决于您期望的逻辑)。

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx http://msdn.microsoft.com/en-us/library/ms668604.aspx

希望对你有帮助。

【讨论】:

    【解决方案2】:

    值对象是不可变的,这意味着当您更新一个值对象时,您需要删除它,然后添加更新的对象。

    由于值对象的身份不存在,因此您必须删除您的实体/聚合根(客户)的所有地址,然后再次添加它们。

    如果你的值对象非常大,那么这可能表明它不应该是一个值对象,而是一个实体。

    【讨论】:

      【解决方案3】:

      您需要跟踪地址集合的状态。您可以使用每记录标志来指示记录已插入或更新。

      或者,您可以使用 DataSet 而不是 List。 DataSet 包括对更改跟踪的支持,您可以将其绑定回 ADO.NET(例如,使用 SqlDataAdapter)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多