【发布时间】:2013-02-01 11:54:01
【问题描述】:
我已经开始为 MVC n 层应用程序使用实体框架 (EF)。很明显,这是一个 Web 应用程序(它是无状态的),我将不得不使用分离的对象模型。执行 Add 操作没有歧义。但是,在进行编辑时,有两种方法
- 在上下文中获取原始对象,附加更新的对象并 然后保存到数据库。在回答这个问题时提到的东西 问题 EF4 Context.ApplyCurrentValues does not update current values
- 使用对象的各个字段的 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 为我自动生成类文件。所以每次我更新我的数据库时,都会重新生成类文件。
【问题讨论】:
标签: asp.net-mvc-3 entity-framework-4.1 repository-pattern n-tier-architecture