我已经开始为 MVC n 层应用程序使用实体框架 (EF)。很明显,这是一个 Web 应用程序(它是无状态的),我将不得不使用分离的对象模型。执行 Add 操作没有歧义。但是,在进行编辑时,有两种方法
- 在上下文中获取原始对象,附加更新的对象,然后保存到数据库。在回答这个问题 EF4 Context.ApplyCurrentValues 时提到的东西 不会更新当前值
- 使用本文中提到的对象的各个字段的 IsModified 属性显式设置各个修改的属性 http://msdn.microsoft.com/en-us/data/jj592677.aspx
方法 1 的缺点是每次需要执行更新时都必须将对象从数据库加载到内存中。方法 2 将需要从要更新对象的任何位置手动传递要设置为 IsModified 的字段为 true。因此,例如对于每个对象,我可能需要为对象的每个字段创建一个布尔集合对象。例如
SaveEntity(EntityClass e, EntityStateClass ec)
{
context.Entry(e).Property("Name").IsModified = ec.NameState;
context.SaveChanges();
}
class EntityStateClass{ public bool NameState;}
出于性能考虑,我更喜欢方法 2,但我受到我正在使用的 n 层架构和存储库模式的阻碍。我的存储库接口限制任何对象的保存方法
SaveEntity(EntityClass e);
所以我不能传递“状态”对象。上下文类不可用,不应该在 DAL 之外可用。所以我不能在外面设置属性。有没有“正确”的方法来实现这一目标?
注意:自我跟踪实体也没有问题,因为我无法将具有状态的实体发送到客户端(浏览器),因为我打算保持 html 轻量级。
编辑:经过深思熟虑,我试图使用以下机制来跟踪我的域类中每个字段的修改状态
- 为实体类声明一个部分类。
- 对于每个可更新的字段,声明一个布尔属性,如“ IsModified_FieldName ”
- 设置字段时设置“IsModified_FieldName ”属性。
但是为此,我需要 Entity Framework 为我生成显式属性,而不是它自动生成的隐式属性。EF 是否提供了执行此操作的句柄?
这是我想要实现的示例代码
//Save Method for class EntityClass.
SaveEntity(EntityClass e)
{
context.Entry(e).Property("Name").IsModified = e.IsModified_Name;
context.SaveChanges();
}
//EntityClass is class autogenerated by EF
public partial class EntityClass
{
//This is auto-generated property by EF
public string Name {get; set;}
/* This is what I would like EF to do
private string name;
public string Name
{
get {return Name;}
set {
name = value;
//this is what I would like to do
this.IsModified_Name = true;
};
}
*/
}
//This is another partial definition for EntityClass that I will provide
public partial class EntityClass
{
//This property will be set to true if "Name" is set
public bool IsModified_Name {get; set;}
}
PS:看来我提供的信息不充分,所以没有回复。
- 我正在使用 DbContext(数据库优先模型)
- EF 为我自动生成类文件。所以每次我更新我的数据库时,都会重新生成类文件。