4

Iには、ContactContactFieldの2つのクラスがあります。 ContactFieldContactに追加された場合、SortOrderContactFieldに自動的に割り当てることを希望します。 DbSetを継承してAddメソッドをカスタマイズする必要がありますか?それを達成する方法?DbSet <T>の追加アクションの観察方法?

public class Foo { 
     private MyDbContext _db = new MyDbContext(); 

     public void HelloWorld() { 
      Contact contact = ....; //< A contact from database. 

      ContactField field = ....; ///< A new field 
      .... ///< assign other properties into this `field` 
      field.FieldType = FieldType.Phone; 

      // How to automatically update `SortOrder` 
      // when adding field into `ContactFields` 
      contact.ContactFields.Add(field); 

      _db.SaveChanges(); 
     } 
} 

public class Contact { 
     public long ContactID { get; set; } 

     public string DisplayName { get; set; } 
     public string DisplayCompany { get; set; } 
     public DateTime CreatedTime { get; set; } 
     public DateTime ModifiedTime { get; set; } 

     // Original codes  
     //public virtual ICollection<ContactField> ContactFields { get; set; } 
     public virtual MyList<ContactField> ContactFields { get; set; } 
} 

public class ContactField { 
     public long ContactFieldID { get; set; } 
     public int SortOrder { get; set; } 
     public int FieldType { get; set; } 

     public string Value { get; set; } 
     public string Label { get; set; } 

     [Column("ContactID")] 
     public int ContactID { get; set; } 
     public virtual Contact Contact { get; set; } 
} 

編集: 私は私が必要なものを見つけるには、ICollection<ContactField> ContactFieldsの変化を監視することです。 List<T>ICollection<T>の実装です。そこで、私はカスタムMyListを作成し、MyListコンテナの変更を通知するように頼みます。私はそれが動作するかどうかをテストします。

public class MyList<TEntity> : List<TEntity> { 
     public delegate OnAddHandler(object sender, TEntity entry); 
     public event OnAddHandler OnAddEvent; 

     public new void Add(TEntity entity) { 
      OnAddEvent(this, entity); 
      base.Add(entity); 
     } 
} 

答えて

6

DbSetはObservableCollectionあるLocal性質を有しています。 CollectionChangedイベントを購読し、そこでソート順を更新することができます。

public class Foo { 
     private MyDbContext _db = new MyDbContext(); 

     public void HelloWorld() { 

      _db.Contacts.Local.CollectionChanged += ContactsChanged; 

      Contact contact = ....; //< A contact from database. 

      ContactField field = ....; ///< A new field 
      .... ///< assign other properties into this `field` 
      field.FieldType = FieldType.Phone; 

      // How to automatically update `SortOrder` 
      // when adding field into `ContactFields` 
      contact.ContactFields.Add(field); 

      _db.SaveChanges(); 
     } 

     public void ContactsChanged(object sender, NotifyCollectionChangedEventArgs args) { 

      if (args.Action == NotifyCollectionChangedAction.Add) 
      { 

       // sort 
      }  
     } 
} 
+0

'Contact'が' _db'に保存されていない場合、 'ICollection ContactFields'の' Add'アクションを観察できますか? – AechoLiu

+0

このアプローチについてありがとうございます。私は私の質問を編集しました。 – AechoLiu

+0

'.Local'にアクセスすると、テーブル全体がデータベースからメモリにロードされることに注意してください。中規模のテーブルであっても、パフォーマンスに大きな影響を与えます。 – Breeze

1

またDbContextにSaveChangesメソッドをオーバーライドして、特定のタイプの新しいエンティティを見つけて、そのソート順序のプロパティを設定するには、ローカルChangeTrackerプロパティを使用します。 1つの場所で最終更新日のようなものを設定するのに最適です。

関連する問題