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

本文关键字:对象 其他 包含 集合 更新 ado net | 更新日期: 2023-09-27 18:18:32

我有一个客户实体。我的客户实体有一个属于我的给定实体的地址值对象集合。如果客户添加了一个新地址,当我将其传递回存储库进行更新时,存储库如何知道哪个地址是要添加的新地址?我用的是纯ado.net。

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

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

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

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

同样,如果你的集合是一个ObservableCollection,你将能够跟踪一个项目是否被添加(并进行适当的插入),如果一些对象被删除(并进行适当的删除或更新,如果它被移动到另一个对象,这取决于你期望的逻辑)。

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

希望能有所帮助。

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

由于值对象的身份不存在,那么您将不得不删除您的实体/聚合根(客户)的所有地址,然后重新添加它们。

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

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

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