如何观察DbSet 的Add动作?
我有两个名为Contact
和ContactField
类,如下所示。 将ContactField
添加到Contact
,我希望自动将SortOrder
分配给ContactField
。 我是否需要inheritanceDbSet并自定义Add
方法? 怎么实现呢?
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 ContactFields { get; set; } public virtual MyList 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 ContactFields
的变化。 List
是ICollection
。 因此,我创建了一个自定义MyList
并要求它通知MyList
容器的更改。 我会测试它是否有效。
public class MyList : List { public delegate OnAddHandler(object sender, TEntity entry); public event OnAddHandler OnAddEvent; public new void Add(TEntity entity) { OnAddEvent(this, entity); base.Add(entity); } }
DbSet有一个Local属性,它是一个ObservableCollection
。 您可以订阅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 } } }
或者,重写DbContext上的SaveChanges方法,并使用本地ChangeTracker属性查找特定类型的新实体并设置其排序顺序属性。 适用于将上次更新日期等内容设置为1个位置。