【问题标题】:How to achieve partial update in Entity Framework 5/6?如何在 Entity Framework 5/6 中实现部分更新?
【发布时间】:2016-05-14 02:51:34
【问题描述】:

我正在使用数据库优先方法开发实体框架,我遇到了以下问题。

我有一个包含 col1、col2、col3、....、col8 列的 Customer 表。我为这个表创建了一个实体,这个表已经有大约 100 条记录。在以上 8 列中,col4 被标记为 Non-null。

Class Customer
    {
         member col1;
         member col2;
         member col3;
         member col4;
         .
         .
         member col8;
    }
    class Main
    {
       //main logic to read data from database using EF 
       Customer obj = object of Customerwith values assigned to col1,col2 and col3 members
       obj.col2=some changed value.
       DBContext.SaveChanges(); //<- throws an error stating it is expecting value of col4. 

    }

在我的应用程序中,我尝试使用 EF 的存储过程读取记录之一,并且存储过程仅返回 col1、col2 和 col3。 我正在尝试保存 col2 的修改值并尝试使用 DBContext 保存回数据库。但它会显示错误说明未提供必填字段 col4 的值。

仅供参考:我已经浏览了几个论坛,并且在 SaveChanges 上禁用验证的问题和选项对我来说是不可行的。

还有其他方法可以实现部分更新吗?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    我猜EntityFramework.Utilities 满足你的条件。

    这段代码:

    using (var db = new YourDbContext())
    {
        db.AttachAndModify(new BlogPost { ID = postId }).Set(x => x.Reads, 10);
        db.SaveChanges();
    }
    

    将生成单个 SQL 命令:

    exec sp_executesql N'UPDATE [dbo].[BlogPosts]
    SET [Reads] = @0
    WHERE ([ID] = @1)
    ',N'@0 int,@1 int',@0=10,@1=1
    

    【讨论】:

    • 让我试试这个,结果会告诉你。
    • @atp9,嗨!你的进展如何? =)
    【解决方案2】:

    SaveChanges 上的禁用验证对我来说不可行

    确实如此。您甚至必须禁用保存时的验证。但是你不能将整个实体标记为已修改,我认为你这样做了。您必须将单个属性标记为已修改:

    var mySmallCustomer = someService.GetCustomer(); // from sproc
    mySmallCustomer.col2 = "updated";
    
    var myLargeCustomer = new Customer();
    context.Customers.Attach(myLargeCustomer);
    Entry(myLargeCustomer).CurrentValues.SetValues(mySmallCustomer);
    
    // Here it comes:
    Entry(myLargeCustomer).Property(c => c.col2).IsModified = true;
    
    context.Configuration.ValidateOnSaveEnabled = false;
    context.SaveChanges();
    

    因此,您会发现吸引“小”客户就足够了。从此对象创建一个存根实体 (myLargeCustomer),用于更新一个属性。

    【讨论】:

      猜你喜欢
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2014-09-29
      • 2017-07-13
      • 2013-02-26
      • 2014-11-11
      相关资源
      最近更新 更多