如何在ado.net中更新包含c#中其他对象集合的对象?

时间:2011-12-22 16:28:58

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

事实是它很复杂,这就是为什么人们应该使用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

希望它有所帮助。