Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 具有MVC应用程序的分离模式实体框架_Asp.net Mvc 3_Entity Framework 4.1_Repository Pattern_N Tier Architecture - Fatal编程技术网

Asp.net mvc 3 具有MVC应用程序的分离模式实体框架

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

我已经开始为MVC n层应用程序使用实体框架(EF)。很明显,这是一个web应用程序(无状态),我必须使用分离的对象模型。执行“添加”操作没有歧义。但是,在进行编辑时,有两种方法

  • 在上下文中获取原始对象,附加更新的对象并 然后保存到数据库。在回答这个问题时提到了类似的东西 问题
  • 使用对象的各个字段的IsModified属性显式设置各个修改的属性,如 本文中提到的
  • 方法1的缺点是每次需要执行更新时都必须将对象从数据库加载到内存中。 方法2需要手动传递哪些字段将被设置为IsModified为true,无论对象在哪里更新。例如,对于每个对象,我可能需要为对象的每个字段创建一个布尔集合对象。 e、 g

    出于性能考虑,我更喜欢方法2,但我正在使用的n层体系结构和存储库模式阻碍了我的工作。“我的存储库”界面限制要保存的任何对象的保存方法

     SaveEntity(EntityClass e);
    
    所以我不能传递“state”对象。上下文类不可用,并且不应在DAL外部可用。所以我不能在外面设置属性。有什么“适当”的方法来实现这一点吗?
    注意:自跟踪实体也是毫无疑问的,因为我无法将状态为的实体发送到客户端(浏览器),因为我想保持html的轻量级

    编辑:经过深思熟虑,我尝试使用以下机制来跟踪域类中每个字段的修改状态

    • 为实体类声明分部类
    • 对于每个可更新的字段,声明一个类似“IsModified_FieldName”的布尔属性
    • 设置字段时,设置“IsModified_FieldName”属性
    然而,为此,我需要实体框架为我生成显式属性,而不是它自动生成的隐式属性。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自动为我生成类文件。因此,每次更新数据库时,都会重新生成类文件

    对于您的具体问题:实体是由T4模板生成的,应该可以修改此模板(文本格式)以按照您希望的方式生成实体

    但我对你的想法有几点看法:

    • 在web应用程序中,数据通常由用户在浏览器中更改。要明确知道真正发生了什么变化,您需要跟踪浏览器中的变化(例如,当用户编辑文本框时,可能通过一些Javascript在数据中设置标志(例如ViewModel)

      如果不跟踪浏览器中的更改,会发生什么?数据被发回服务器,而您不知道服务器端(控制器中有MVC)的哪个属性已更改。因此,您唯一的机会是映射已发布回您的
      EntityClass的所有属性,并且无论用户是否真的进行了更改,每个属性都将标记为
      已修改的
      。当您稍后调用
      SaveChanges
      EF时,将编写一条
      UPDATE
      语句,该语句涉及所有这些属性,并且您需要避免不必要的开销

    • 那么,通过设置单个属性而不是将整个实体的状态设置为
      Modified
      ,您赢得了什么?在这两种情况下,您都将所有属性标记为
      已修改
      。例外情况是实体的部分更改,例如:您有一个
      客户
      实体,该实体具有
      名称
      城市
      属性,视图只允许编辑
      名称
      ,而不允许编辑
      城市
      ,相应的视图模型只包含
      名称
      属性。在这种情况下,您的过程只会将
      客户
      实体的
      名称
      属性标记为
      已修改
      ,而不是
      城市
      。您可以在这里保存一点,因为您没有将
      City
      属性值保存到数据库中。但是您仍然保存
      名称
      ,即使它没有更改

    • 如果使用解决方案1(
      ApplyCurrentValues
      ),则必须首先从数据库中加载实体,是的,但它只会将属性标记为
      Modified
      ,与数据库中的值相比确实发生了更改。如果用户没有更改任何内容,则根本不会编写
      更新

    • 请记住,您只是刚刚开始实施您的概念。除标量属性更改(即关系更改)外,浏览器中还可以对数据进行其他更改。例如,用户将关系从
      订单
      更改为
      客户
      ,或者您的视图包含
      订单
      订单项
      集合,用户不仅可以编辑
      订单
      标题,还可以编辑
      订单项
      并删除和添加新的
      订单项
      s。当数据从浏览器返回到服务器时,您希望如何识别已添加和已删除的收集项目-除非您在浏览器中跟踪所有这些更改,并将跟踪信息发送回服务器(实际数据除外),或者除非您重新加载
      订单
      ,以及
      OrderItem
      s,并将更改合并到原始enti中
       //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;}
        }