Asp.net mvc 3 具有MVC应用程序的分离模式实体框架
我已经开始为MVC n层应用程序使用实体框架(EF)。很明显,这是一个web应用程序(无状态),我必须使用分离的对象模型。执行“添加”操作没有歧义。但是,在进行编辑时,有两种方法Asp.net mvc 3 具有MVC应用程序的分离模式实体框架,asp.net-mvc-3,entity-framework-4.1,repository-pattern,n-tier-architecture,Asp.net Mvc 3,Entity Framework 4.1,Repository Pattern,N Tier Architecture,我已经开始为MVC n层应用程序使用实体框架(EF)。很明显,这是一个web应用程序(无状态),我必须使用分离的对象模型。执行“添加”操作没有歧义。但是,在进行编辑时,有两种方法 在上下文中获取原始对象,附加更新的对象并 然后保存到数据库。在回答这个问题时提到了类似的东西 问题 使用对象的各个字段的IsModified属性显式设置各个修改的属性,如 本文中提到的 方法1的缺点是每次需要执行更新时都必须将对象从数据库加载到内存中。 方法2需要手动传递哪些字段将被设置为IsModified为tr
SaveEntity(EntityClass e);
所以我不能传递“state”对象。上下文类不可用,并且不应在DAL外部可用。所以我不能在外面设置属性。有什么“适当”的方法来实现这一点吗?
注意:自跟踪实体也是毫无疑问的,因为我无法将状态为的实体发送到客户端(浏览器),因为我想保持html的轻量级 编辑:经过深思熟虑,我尝试使用以下机制来跟踪域类中每个字段的修改状态
- 为实体类声明分部类李>
- 对于每个可更新的字段,声明一个类似“IsModified_FieldName”的布尔属性
- 设置字段时,设置“IsModified_FieldName”属性
//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自动为我生成类文件。因此,每次更新数据库时,都会重新生成类文件
- 在web应用程序中,数据通常由用户在浏览器中更改。要明确知道真正发生了什么变化,您需要跟踪浏览器中的变化(例如,当用户编辑文本框时,可能通过一些Javascript在数据中设置标志(例如ViewModel)
如果不跟踪浏览器中的更改,会发生什么?数据被发回服务器,而您不知道服务器端(控制器中有MVC)的哪个属性已更改。因此,您唯一的机会是映射已发布回您的
EntityClass的所有属性,并且无论用户是否真的进行了更改,每个属性都将标记为
已修改的
。当您稍后调用
EF时,将编写一条SaveChanges
语句,该语句涉及所有这些属性,并且您需要避免不必要的开销UPDATE
- 那么,通过设置单个属性而不是将整个实体的状态设置为
,您赢得了什么?在这两种情况下,您都将所有属性标记为Modified
。例外情况是实体的部分更改,例如:您有一个已修改
实体,该实体具有客户
和名称
属性,视图只允许编辑城市
,而不允许编辑名称
,相应的视图模型只包含城市
属性。在这种情况下,您的过程只会将名称
实体的客户
属性标记为名称
,而不是已修改
。您可以在这里保存一点,因为您没有将城市
属性值保存到数据库中。但是您仍然保存City
,即使它没有更改名称
- 如果使用解决方案1(
),则必须首先从数据库中加载实体,是的,但它只会将属性标记为ApplyCurrentValues
,与数据库中的值相比确实发生了更改。如果用户没有更改任何内容,则根本不会编写Modified
更新
- 请记住,您只是刚刚开始实施您的概念。除标量属性更改(即关系更改)外,浏览器中还可以对数据进行其他更改。例如,用户将关系从
更改为订单
,或者您的视图包含客户
和订单
集合,用户不仅可以编辑订单项
标题,还可以编辑订单
并删除和添加新的订单项
s。当数据从浏览器返回到服务器时,您希望如何识别已添加和已删除的收集项目-除非您在浏览器中跟踪所有这些更改,并将跟踪信息发送回服务器(实际数据除外),或者除非您重新加载订单项
,以及订单
s,并将更改合并到原始enti中OrderItem
//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;} }