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
source share
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
source

Alternatively, override the SaveChanges method in the DbContext and use the local ChangeTracker property to search for new objects of a particular type and set their sort order property. Great for setting things like last updated date in 1 place.

+1
source

Source: https://habr.com/ru/post/1399514/


All Articles