我想了解其他人如何应对以下情况。
这不是家庭作业或任何形式的作业。创建示例类是为了更好地说明我的问题,但它确实反映了我们想要反馈的真实生活场景。
我们从数据库中检索所有数据并将其放入对象中。对象表示单个记录,如果数据库中存在多个记录,我们将数据放入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对象,以便我们可以;
查看已更改的属性,以便可以将更改保留到数据库。
查看第二个列表&lt;&gt;中不再存在的属性(记录)这样可以从数据库中删除这些记录。
查看新列表中的新属性&lt;&gt;这样我们就可以在数据库中创建它们。
谁想要了解我们如何才能最好地实现这一目标。请记住,我们还需要深入查看Employee_Address列表以检查是否有任何更改,而不仅仅是顶级属性。
我希望我已经清楚明白并期待任何建议。
答案 0 :(得分:1)
将可空的ObjectID字段添加到图层的基本类型。将其传递给前端并返回以查看特定实例是否在数据库中持续存在。 即使您没有任何类型的身份地图,它也有许多其他用途
答案 1 :(得分:0)
我会在他们的Data
类中完成相同的事情,即保持记录状态(System.Data.DataRowState
浮现在脑海中)并将所有关联的版本放在一个对象中。
这样:
答案 2 :(得分:0)
为什么要比较两个列表对象?您可能会使用大量内存来处理基本上重复的数据。
我建议为每个对象设置一个status属性,告诉您该特定对象是New,Deleted还是Changed。如果你想进一步使该属性成为枚举,你可以使它成为一个包含某种包含要更新的更改的字典的对象,尽管这很可能仅适用于更改状态。
添加了这样的属性后,应该很容易浏览列表,添加新对象,删除已删除对象等。
您可能想要检查实体框架如何执行此类操作。
答案 3 :(得分:0)
您应该调查Identity Map模式的使用。与Unit of Work结合使用,这允许您维护一个对象“缓存”,您可以从中检查哪些对象需要保存到数据库,以及在读取时,从身份映射返回对象而不是创建新对象和归还那些。