How to track changes to business objects?我有一个创建业务对象或实体以表示诸如Person之类的概念。然后,我可以使用DTO序列化Person并将其发送给客户端。如果客户端更改了对象,则可以在该对象上具有IsDirty标志,因此当它发送回我知道的服务器以对其进行更新时。 但是如果我有一个Order对象怎么办?它具有主要的标题信息,客户,供应商,所需日期等。然后具有OrderItems,它是List 我已经在简单的Person实例上找到了各种示例,而不是诸如Orders这类的标头详细信息示例。 BTW为此使用C#3.5。 首先,您可以使用解决这些问题的现有框架,例如CSLA.NET。这个框架的作者已经解决了这些问题。为此,请访问http://www.rockfordlhotka.net/cslanet/。即使您没有使用完整的框架,这些概念仍然适用。 如果您想自己动手制作,过去我所做的是使用集合从BindingList派生的自定义类型,而不是对集合使用List。从BindingList中进行插入允许您覆盖添加/删除项目的行为。因此,例如,您可以拥有另一个内部的"删除"项目。每次在您的集合上调用重写的Remove方法时,请将该项放入"已删除"集合中,然后调用Remove方法的基本实现。您可以对添加的项目或更改的项目执行相同的操作。 您会发现需要一个工作单元,但是不要写一个工作单元。使用NHibernate或其他一些ORM。那就是他们的目的。它们具有内置的工作单元。 对于大多数应用程序来说,业务对象确实是"必经之路"。您正潜入更深的领域,将会有很多要做的事情。查看DDD。 我也强烈建议您不要在后面的代码中使用类似的代码。查看MVP模式。 我也(在我不愿意学习很多新的,非常关键的事情的同时)研究SOLID。 您可能想查看JP Boodhoo的.net课程,因为它涵盖了很多这些内容。 数据对象不跟踪更改。更改跟踪发生在DataContext和您通过DataContext检索到的对象上。因此,为了跟踪更改,您需要执行以下操作:
现在在代码背后,您可以执行以下操作:
我不建议直接在后面的代码中使用数据上下文,但这是使用Linq To SQL的好方法。我建议将所有数据库交互都放在一个外部项目中,并从GUI调用封装此行为的类。 如果您不熟悉Linq To Sql,我建议创建一个Linq To Sql(dbml)文件。 在解决方案资源管理器中右键单击您的项目,然后选择"添加新项"。选择Linq To SQL文件,然后它将使您连接到数据库并选择表。 然后您可以查看生成的代码,并获得有关Linq To Sql的工作原理以及如何使用它的一些好主意。 将其用作使用Linq to SQL的指南,这将使您走得更远... |