How to observe the addition of a DbSet <T> action?
I have two classes named Contact and ContactField as follows. When a ContactField added to Contact , I hope to automatically assign SortOrder to ContactField . Do I need to inherit DbSet and configure the Add method? How to reach it?
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; } } Edit: I found that I need to keep track of ICollection<ContactField> ContactFields . And List<T> is an implementation of ICollection<T> . So I create a custom MyList and ask that it notifies me of changes to the MyList container. I will check its work or not later.
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); } } +4
2 answers
DbSet has a Local property, which is an ObservableCollection . You can subscribe to the CollectionChanged event and update the sort order there.
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 } } } +6