代码之家  ›  专栏  ›  技术社区  ›  Code Silverback

EF 4.0 POCO magic不起作用-未检测到任何更改

  •  3
  • Code Silverback  · 技术社区  · 15 年前

    我似乎无法从断开连接的poco对象更新数据库。在本例中,我获取一个ApplicationUser对象update varchar(100)field SSOID,但没有任何更改生效。即使我在save方法中重新提取对象,也不会向db发送任何内容。

    在ObjectStateManager中找不到键与所提供对象的键匹配的对象。验证所提供对象的键值是否与必须应用更改的对象的键值匹配。

     public void Save(ApplicationUser au)
     {
         ApplicationUser original = context.ApplicationUsers.FirstorDefault(a => a.UserID == au.UserID);
         context.ContextOptions.ProxyCreationEnabled = false;  //changing this has no effect
    
         if(original == null)
         {
             context.AddObject("ApplicationUsers",au); //this works!
         }
         else
         {
              ///let's manually set some properties on the object I just fetched.
              original.SSOID = au.SSOID;
              ObjectStateEntry entry = null;
              context.DetectChanges();
              context.ObjectStateManager.TryGetObjectStateEntry(original.EntityKey, out entry);
              //entry is still null!
              context.ApplicationUsers.ApplyCurrentValues(original);  //BOOM!!
          }
          context.SaveChanges();
          return;
      }
    

    我想尽一切办法,甚至 ApplicationUser 实施 System.Data.Objects.DataClasses.IEntityWithKey

    这是地图:

    <EntitySetMapping Name="ApplicationUsers">
        <EntityTypeMapping TypeName="MyCompanyName.ApplicationUser">
             <MappingFragment StoreEntitySet="ApplicationUser">
                <ScalarProperty Name="UserID" ColumnName="UserID" />
                <ScalarProperty Name="SystemID" ColumnName="SystemID" />
                <ScalarProperty Name="Username" ColumnName="Username" />
                <!--snip-->
                <ScalarProperty Name="CreatedOn" ColumnName="CreatedOn" />
                <ScalarProperty Name="CreatedBy" ColumnName="CreatedBy" />
                <ScalarProperty Name="SSOID" ColumnName="SSOID" />
             </MappingFragment>
         </EntityTypeMapping>
    </EntitySetMapping>
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   marc_s MisterSmith    15 年前

    你用的是直的/简单的 POCO T4 template ,或自跟踪实体模板??

    直接的POCO不支持任何更改跟踪——如果您需要,您需要自跟踪实体。

    更新: 我认为你在这里做事情的方式是非常正确的。重新加载对象的原始状态(我可能会对时间戳或其他内容添加检查,以确保存储中的对象在此期间没有更改)。

    au original ;更新 起初的 相应地,然后简单地调用 context.SaveChanges()

    据我所知 .DetectChanges() 无法工作,因为您使用的是没有任何更改跟踪的直接POCO类,例如 澳大利亚 对象无法知道发生了什么更改—您基本上需要自己通过属性比较来完成属性。