我有两个名为Contact
和ContactField
的课程,如下所示。将ContactField
添加到Contact
后,我希望自动将SortOrder
分配给ContactField
。我是否需要继承DbSet并自定义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<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);
}
}
容器的更改。我将测试它是否有效。
{{1}}
答案 0 :(得分:7)
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
}
}
}
答案 1 :(得分:1)
或者覆盖DbContext上的SaveChanges方法,并使用本地ChangeTracker属性查找特定类型的新实体并设置其排序顺序属性。适用于将上次更新日期等内容设置为1个位置。