2012-03-22 60 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);