c#数据库持久性的对象相等

时间:2009-04-02 08:22:29

标签: c# class object persistence equality

我想了解其他人如何应对以下情况。

这不是家庭作业或任何形式的作业。创建示例类是为了更好地说明我的问题,但它确实反映了我们想要反馈的真实生活场景。

我们从数据库中检索所有数据并将其放入对象中。对象表示单个记录,如果数据库中存在多个记录,我们将数据放入List<>中。记录对象。

假设我们有以下课程;

    public class Employee
    {
        public bool _Modified;
        public string _FirstName;
        public string _LastName;
        public List<Emplyee_Address> _Address;
    }

    public class Employee_Address
    {
        public bool _Modified;
        public string _Address;
        public string _City;
        public string _State;
    }

请注意,为了清楚起见,类中省略了Getters和Setter。在任何代码警察指责我不使用它们之前,请注意,这个例子只是被遗漏了。

数据库有一个Employees表和另一个Employee Addresses表。

从概念上讲,我们所做的是创建一个List对象,该对象表示数据库表中的数据。我们对此对象进行深度克隆,然后将其绑定到前端的控件。然后我们有两个对象(Orig和Final)代表数据库中的数据。

然后,用户通过创建,修改,删除记录来更改“最终”对象。然后,我们希望将这些更改保留到数据库中。

显然,我们希望尽可能优雅,只需编辑,创建,删除需要它的记录。

我们最终想比较两个List对象,以便我们可以;

  1. 查看已更改的属性,以便可以将更改保留到数据库。

  2. 查看第二个列表&lt;&gt;中不再存在的属性(记录)这样可以从数据库中删除这些记录。

  3. 查看新列表中的新属性&lt;&gt;这样我们就可以在数据库中创建它们。

  4. 谁想要了解我们如何才能最好地实现这一目标。请记住,我们还需要深入查看Employee_Address列表以检查是否有任何更改,而不仅仅是顶级属性。

    我希望我已经清楚明白并期待任何建议。

4 个答案:

答案 0 :(得分:1)

将可空的ObjectID字段添加到图层的基本类型。将其传递给前端并返回以查看特定实例是否在数据库中持续存在。 即使您没有任何类型的身份地图,它也有许多其他用途

答案 1 :(得分:0)

我会在他们的Data类中完成相同的事情,即保持记录状态(System.Data.DataRowState浮现在脑海中)并将所有关联的版本放在一个对象中。

这样:

  • 您可以一眼就看出它是否已被修改,插入,删除或仍然是原始记录。
  • 您可以通过查询新版本和旧版本快速找到已更改的内容,而无需深入查找旧版本。

答案 2 :(得分:0)

为什么要比较两个列表对象?您可能会使用大量内存来处理基本上重复的数据。

我建议为每个对象设置一个status属性,告诉您该特定对象是New,Deleted还是Changed。如果你想进一步使该属性成为枚举,你可以使它成为一个包含某种包含要更新的更改的字典的对象,尽管这很可能仅适用于更改状态。

添加了这样的属性后,应该很容易浏览列表,添加新对象,删除已删除对象等。

您可能想要检查实体框架如何执行此类操作。

答案 3 :(得分:0)

您应该调查Identity Map模式的使用。与Unit of Work结合使用,这允许您维护一个对象“缓存”,您可以从中检查哪些对象需要保存到数据库,以及在读取时,从身份映射返回对象而不是创建新对象和归还那些。