Как наблюдать действие Добавить DbSet <T>? - PullRequest
5 голосов
/ 03 марта 2012

У меня есть два класса с именами 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> ContactFieldsList<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);
        }
 }

Ответы [ 2 ]

7 голосов
/ 03 марта 2012

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 голос
/ 03 марта 2012

В качестве альтернативы можно переопределить метод SaveChanges в DbContext и использовать локальное свойство ChangeTracker, чтобы найти новые объекты определенного типа и установить их свойство порядка сортировки.Отлично работает для установки таких вещей, как дата последнего обновления в 1 месте.

...