2011-10-28 9 views
2

自動チェンジトラッキング(プロキシオブジェクト)を有効にしたEntity Framework 4.1では、Entity.IsDirtyをサポートするのが簡単なはずです。しかし、これまでのところこれが見つからない。EF 4.1の参照プロパティを持つエンティティがダーティであるかどうかを判断する方法は?

public class DomainContext : DbContext, IDomainContext 
{ 

    /// <summary> 
    /// Indicates whether changes have been made to the entity with that have 
    /// not been saved. This method assumes EF Proxies are being used for change tracking. 
    /// </summary> 
    /// <param name="entityId">The Id of the entity.</param> 
    /// <returns>True if the entity is dirty, false otherwise.</returns> 
    public bool HasChanges(Guid entityId) 
    { 
     foreach (DbEntityEntry entry in this.ChangeTracker.Entries()) 
     { 
      IEntity entity = entry.Entity as IEntity; 
      if (entity != null) 
      { 
       if (entity.Id == entityId && entry.State != System.Data.EntityState.Unchanged) 
       { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
} 

参照/複合プロパティであるエンティティのプロパティが変更されている場合、上記の方法は機能していないようです。例えば:私は上記のクラスをアップし、新たな、またはデータベースから既存のUserPreferencesエンティティを取得し、PrimaryOperatingAreaのプロパティを変更する場合

public class UserPreferences : EntityBase 
{ 

    /// <summary> 
    /// Comma delimited list of AFEs for which the user is interested in viewing Events. 
    /// </summary> 
    public virtual string ViewableAFEs { get; set; } 

    /// <summary> 
    /// The primary operating area for the user. This is used for defaulting purposes. 
    /// </summary> 
    public virtual OperatingArea PrimaryOperatingArea 
    { 
     get { return _primaryOpArea; } 
     set 
     { 
      if (_primaryOpArea != value) 
      { 
       _primaryOpArea = value; 
       RaisePropertyChanged(() => PrimaryOperatingArea); 
      } 
     } 
    } 
} 

、DomainContext.HasChangesはfalseを返します。 Entity Frameworkが複雑な&参照プロパティを値タイプのプロパティとは違って追跡するため、これが発生していると思います。

上記のHasChangesメソッドを呼び出すときに、ViewableAFEsプロパティ(文字列)を変更すると変更が反映されます。

私の質問はどのように私は(複雑、参照、コレクション型を含む)すべてのプロパティを評価し、エンティティが汚れているかどうかを確認します私の派生DomainContext上の一般的な方法を公開しますでしょうか?

私は不思議なことに、EF 4.1を使ってIsDirty機能にEFを利用している人がいますか、INotifyPropertyChangedなどを使用してisDirtyをロールしましたか?

ありがとうございます!

答えて

3

DbContext APIは、エンティティまたは一部のプロパティが変更されたかどうかを確認するオプションを公開しています。エンティティが変更されたかどうかを確認する

  • するvar myFooHasChanges = context.Entry(MYFOO).State == EntityState.Modified。

  • プロパティが変更されたかどうかを確認する:

    VAR barWasModified = context.Entry(MYFOO).Property(U => u.Bar).IsModified。あなたはこのすべてについて読むことができます

Using DbContext in EF 4.1 Part 5: Working with Property Values

+0

は、指定されたエンティティのいずれかのプロパティが変更されたかどうかを判断するために多くの作業のように思えるが、あなたは私の質問に答えました。ご協力いただきありがとうございます。回答を回答としてマークする。 –

+0

あなたはリフレクションを通じてエンティティ内のすべてのプロパティの検証を自動化することができます。それをチェックアウト:http://msdn.microsoft.com/en-us/library/ms173183%28v=VS.100%29.aspx –

関連する問題