2012-03-22 18 views
16
私はリポジトリパターンとエンティティフレームワークで、MVCプロジェクトに取り組んでいます

が、今私のフォーム上で、私はサンプルモデルEntityFramework更新部分モデル

たSampleModel
1)名前
2)年齢
3を持っている)のアドレス
4)

を更新
5)日は、私が編集フォーム
1にのみ、以下のデータを表示していますノート)名前
2)年齢
3)私は更新した場合、今のリポジトリを使用して不足しているプロパティ値を持つモデル、ノート、dateupdatedフィールドがnullになり

取り組みます。

私の質問は、リポジトリ(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 ... thatsをマークするジェネリックヘルパーを書くことは、TryUpdateがやっていなければならないことです。 – Milan

+0

Entry()はEF 4.0に存在しません。 – Suncat2000

+1

@ Suncat2000:2番目の例はEF 4.0のもので、最初のものはEF 4.1以降のものです。 –

1

は、これは古いスレッドですが、誰もが興味を持っている場合、ラディスラフのソリューションに拡張するために、我々はEF4.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; 
    } 

明らかにyあなたのPOCOに同じ名前のインターフェースを使用していない限り、IEntity制約を取り除く必要があります。 OK

 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); 
関連する問題