如何跟踪业务对象的更改?

use*_*355 7 c# business-objects

我得到了创建业务对象或实体来表示类似Person的概念.然后我可以使用DTO序列化Person并将其发送给客户端.如果客户端更改了对象,它可以在那里有一个IsDirty标志,所以当它被发送回服务器时,我知道要更新它.

但是如果我有一个Order对象呢?这有主页头信息,客户,供应商,所需日期等.然后它有OrderItems,它是一个List <OrderItem>,是要订购的项目.我希望能够在我的UI上使用此业务对象.所以我有一些文本框连接到位置,供应商,所需日期等,并且网格连接到OrderItems.由于OrderItems是一个List,我可以轻松地添加和删除记录.但是我该如何跟踪这个,特别是删除的项目.我不希望删除的项目在我的网格中可见,如果我使用foreach,我不应该迭代它们,因为它们已被删除.但是我仍然需要跟踪删除的事实.如何跟踪更改.我想我需要使用一个单位的工作?但随后代码似乎变得相当复杂.那么我想知道为什么不简单地使用DataTables并免费获得更改跟踪?但后来我读到了业务对象是如何实现的.

我在简单的Person示例中找到了各种示例,bnut不是像Orders这样的标题详细示例.

BTW使用C#3.5.

Ily*_*lev 6

首先,您可以使用解决这些问题的现有框架,例如CSLA.NET.该框架的作者已经解决了这些问题.请访问http://www.rockfordlhotka.net/cslanet/.即使您不使用完整框架,这些概念仍然适用.

如果你想自己动手,我过去所做的就是不使用List作为我的集合,而是使用了从BindingList派生的自定义类型.从BindingList中获取允许您覆盖添加/删除项的行为.因此,您可以拥有另一个"delteted"项目的内部集合.每次在集合上调用overriden Remove方法时,将该项放入"deleted"集合中,然后调用Remove方法的基本实现.您可以对添加的项目或更改的项目执行相同的操作.


Dea*_*lin -1

数据对象不跟踪更改。更改跟踪发生在 DataContext 和您通过 DataContext 检索的对象上。因此,为了跟踪更改,您需要执行以下操作:

public class FooDataContext : DataContext
{
   public Table<Order> Orders;   
}

public class Order
{
    [DbColumn(Identity = true)]
    [Column(DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id { get; set; }

    [DbColumn(Default = "(getutcdate())")]
    [Column(DbType = "DateTime", CanBeNull = false, IsDbGenerated = true)]
    public DateTime DateCreated { get; set; }

    [Column(DbType = "varchar(50)", CanBeNull = false, IsDbGenerated = false)]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在在您的代码隐藏中您可以执行以下操作:

public void UpdateOrder(int id, string name)
{
   FooDataContext db = new FooDataContext();
   Order order = db.Orders.Where(o=>o.Id == id).FirstOrDefault();

   if (order == null) return;

   order.Name = name;

   db.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)

我不建议在后面的代码中直接使用数据上下文,但这是开始使用 Linq To SQL 的好方法。我建议将所有数据库交互放在外部项目中,并从 GUI 调用封装此行为的类。

如果您不熟悉 Linq To Sql,我建议您创建一个 Linq To Sql (dbml) 文件。

在解决方案资源管理器中右键单击您的项目,然后选择“添加新项目”。选择 Linq To SQL 文件,然后它会让您连接到数据库并选择表。

然后,您可以查看生成的代码,并获得有关 Linq To Sql 如何工作以及可以用它做什么的一些好主意。

使用它作为使用 Linq to SQL 的指南,这将带您走得更远......