如何观察DbSet <t>的添加动作?</t>

时间:2012-03-03 03:37:52

标签: c# .net entity-framework entity-framework-4.1 ef-code-first

我有两个名为ContactContactField的课程,如下所示。将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}}

2 个答案:

答案 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个位置。