【问题标题】:EntityFramework update partial modelEntityFramework 更新部分模型
【发布时间】:2012-03-22 10:33:49
【问题描述】:

我正在开发 mvc 项目,使用存储库模式和实体框架,现在在我的表单上我有一个示例模型

样品模型
1) 名称
2) 年龄
3) 地址
4) 笔记
5) 更新日期

我只在编辑表单上显示以下数据
1) 名称
2) 年龄
3) 地址

现在,如果我使用存储库更新缺少属性值的模型,notes, dateupdated 字段将变为空。

我的问题是我如何使用存储库仅更新少数选定的属性(tryupdatemodel 在存储库中不可用)并且我不想调用原始对象并将属性映射到更新的模型。

有没有办法,一定有。

【问题讨论】:

    标签: c# asp.net-mvc windows entity-framework


    【解决方案1】:

    您只能更新部分字段:

    using (var context = new YourDbContext())
    {
        context.SamepleModels.Attach(sampleModel);
    
        DbEntityEntry<SameplModel> entry = context.Entry(sampleModel);
        entry.Property(e => e.Name).IsModified = true;
        entry.Property(e => e.Age).IsModified = true;
        entry.Property(e => e.Address).IsModified = true;   
    
        context.SaveChanges();
    }
    

    或在 ObjectContext API 中:

    using (var context = new YourObjectContext())
    {
        context.SamepleModels.Attach(sampleModel);
    
        ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(sampleModel);
        entry.SetModifiedProperty("Name");
        entry.SetModifiedProperty("Age");
        entry.SetModifiedProperty("Address"); 
    
        context.SaveChanges();
    }
    

    【讨论】:

    • 哦,好吧还是写sql查询来更新吧?或者写一个通用的助手来标记已编辑的属性,嗯……这就是 TryUpdate 必须做的。
    • Entry() 在 EF 4.0 中不存在。
    • @Suncat2000:第二个示例适用于 EF 4.0,第一个示例适用于 EF 4.1 及更高版本。
    • 如何更改此方法以更新不同的属性而无需重新编译?
    • 我只想补充一点,为了充分利用这种方法,您将不得不通过 .Configuration.ValidateOnSave = false 在上下文级别禁用模型验证。从技术上讲,您可以通过在模型中放入“虚拟数据”来确保模型满足模型状态验证 - 如果您不将这些属性设置为修改,则不会将其发送到 SQL,但我建议不要使用这种方法.
    【解决方案2】:

    这是一个旧线程,但如果有人有兴趣扩展 Ladislav 的解决方案,我们已经为 EF 4.1 和更高版本提出了一个有用的扩展方法:

    public static void SetModified<TEntity>(
            this DbEntityEntry<TEntity> entry,
            IEnumerable<Expression<Func<TEntity, object>>> expressions) where TEntity : class, IEntity
        {
            foreach (var expression in expressions)
                entry.Property(expression).IsModified = true;
        }
    

    显然,您需要取消 IEntity 约束,除非您为 POCO 使用同名的接口。

    示例用法如下:

            var user = new User
            {
                Id = Request.Id,
                UserName = Request.UserName,
                FirstName = Request.FirstName
            };
    
            var expressions = new List<Expression<Func<User, object>>> 
                     { 
                         x => x.UserName, 
                         x => x.FirstName
                     };
    
            context.Entry(user).SetModified(expressions);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 2015-12-01
      • 2015-06-18
      • 2021-11-18
      • 2014-02-14
      相关资源
      最近更新 更多