I has two classes named Contact
and ContactField
as following. When the ContactField
is added into Contact
, I hope to assign SortOrder
to ContactField
automatically. Do I need to inherit DbSet and customize the Add
method ? How to achieve 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 what I need is to monitor the changes of ICollection<ContactField> ContactFields
. And the List<T>
is an implementation of ICollection<T>
. So, I create a custom MyList
and ask it notifies the changes of MyList
container. I will test it works 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);
}
}
The 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
}
}
}
Alternatively override the SaveChanges method on the DbContext, and use the local ChangeTracker property to find new entities of a particular type and set their sort order property. Works great for setting things like last updated date in 1 place.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With