【发布时间】:2015-07-19 07:51:19
【问题描述】:
我有一个 C# 程序,可以将数据库中的产品列表加载到产品对象列表中。用户可以通过我的程序界面添加新产品、编辑产品和删除产品。很标准的东西。我的问题与跟踪这些更改并将它们保存回数据库有关。在详细介绍之前,我知道使用 Entity Framework 或 NIBerate 之类的东西可以解决我关于跟踪添加和编辑的问题,但我认为它不会解决我关于跟踪删除的问题。除了想要将大型代码库转换为使用 Entity Framework 或 NIBerate 的替代方法之外,出于我自己的好奇心,我还想知道这个问题的答案。
为了跟踪编辑,我在 Product 类上做这样的事情,我在任何时候更改属性时设置 IsDirty 标志:
class Product
{
public bool IsDirty { get; set; }
public bool IsNew { get; set; }
// If the description is changed, set the IsDirty property
public string Description
{
get
{
return _description;
}
set
{
if (value != _description)
{
this.IsDirty = true;
_description = value;
}
}
}
private string _description;
// ... and so on
}
当我创建一个新的 Product 对象时,我设置了它的 IsNew 标志,因此程序知道在用户下次保存时将其写入数据库。成功将产品写入数据库后,我会清除其 IsNew 和 IsDirty 标志。
为了跟踪删除,我创建了一个 List 类来跟踪已删除的项目:
class EntityList<T> : List<T>
{
public List<T> DeletedItems { get; private set; }
EntityList()
{
this.DeletedItems = new List<T>();
}
// When an item is removed, track it in the DeletedItems list
public new bool Remove(T item)
{
this.DeletedItems.Add(item);
base.Remove(item);
}
}
// ...
// When I work with a list of products, I use an EntityList instead of a List
EntityList<Product> products = myRepository.SelectProducts();
每次我将产品列表保存到数据库时,我都会遍历 EntityList.DeletedItems 属性中的所有产品并从数据库中删除这些产品。成功保存列表后,我会清除 DeletedItems 列表。
所有这些工作,但似乎我可能做的工作太多,特别是跟踪已删除的项目,并记住每次创建新产品对象时设置 IsNew 标志。我无法在 Product 的构造函数中设置 IsNew 标志,因为如果我从数据库加载 Product 对象,我不希望设置该标志。我也对我必须在任何地方使用我的 EntityList 类而不是使用 List 的事实感到不高兴。
这种情况似乎非常普遍,但我无法通过我的研究找到一种优雅的方式来做到这一点。所以我有两个问题:
1) 假设我没有使用实体框架之类的东西,有没有更好的方法来跟踪添加、编辑和删除,然后将这些更改保存到数据库中?
2) 我是否正确地说,即使使用 Entity Framework 或 NIBerate,我仍然需要编写一些额外的代码来跟踪我已删除的项目?
【问题讨论】:
标签: c# database entity-framework