2012-03-22 31 views
16

我正在MVC项目,与存储库模式和实体框架,现在我的形式我都一个样品模型的EntityFramework更新局部模型

的SampleModel
1)名称
2)
年龄 3)地址
4)指出
5)更新日期

我编辑表单上显示只有以下数据
1)名称
2)
年龄 3)解决

现在如果我更新使用存储库中,票据丢失的属性值模型,dateupdated区域变空。

我的问题是我如何更新使用存储库(tryupdatemodel不可用在存储库中)只有少数选定的属性,我不想调用原始对象和映射与更新的模型的合适。

有什么办法,一定有。

回答

21

您可以更新领域的唯一子集:

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(); 
} 
+0

喔确定或编写SQL查询来更新,不是吗?或者编写一个通用的帮助器来标记已编辑的属性,humm ...这就是TryUpdate必须做的事情。 – Milan 2012-03-22 11:12:41

+0

EF 4.0中不存在Entry()。 – Suncat2000 2013-05-22 16:01:50

+1

@ Suncat2000:第二个例子适用于EF 4.0,第一个例子适用于EF 4.1和更高版本。 – 2013-05-22 18:45:54

1

这是一个古老的线程,但如果有人有兴趣,对拉迪斯拉夫的解决方案扩展了,我们“已经想出了一个有用的扩展方法用于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);