EF 6 Code First对象生命周期/信号/事件

时间:2013-12-19 21:34:29

标签: c# .net asp.net-mvc entity-framework

我有一个代码优先模型:

public class Organization
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public DateTime Created { get; set; }

    [Required]
    public DateTime Updated { get; set; }
}

我希望无论何时创建/更新模型,都会自动分配创建/更新日期。我已经看到了一些在上下文中执行此操作的示例,但似乎错误。这样做的正确方法是什么?

例如,在Django中,我可以使用django.models.signals.pre_savedjango.models.signals.post_save来修改保存前/后的对象。

或者我是否认为这一切都错了,我应该一起使用另一种方法?

2 个答案:

答案 0 :(得分:6)

是的,您可以插入自定义的OnUpdate和OnCreate逻辑。您需要覆盖SaveChanges()并添加我们将调用Entity的抽象类。然后在模型类中继承Entity,这意味着现在可以在模型中调用OnUpdate / OnCreate函数,这些函数将自动注入。

以下是您的示例的样子。

<强> YourDataContext.cs

namespace YourProject.Models
{
    public class YourDataContext : DbContext
    {
        public DbSet<Organization> Organizations { get; set; }

        public override int SaveChanges()
        {
            var changedEntities = ChangeTracker.Entries();

            foreach (var changedEntity in changedEntities)
            {
                if (!(changedEntity.Entity is Entity)) continue;
                var entity = (Entity)changedEntity.Entity;

                switch (changedEntity.State)
                {
                    case EntityState.Added:
                        entity.OnBeforeInsert();
                        break;

                    case EntityState.Modified:
                        entity.OnBeforeUpdate();
                        break;

                }
            }

            return base.SaveChanges();
        }
    }

    public abstract class Entity
    {
        public virtual void OnBeforeInsert() { }
        public virtual void OnBeforeUpdate() { }
    }
}

<强> Organization.cs

public class Organization : Entity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public DateTime Created { get; set; }

    [Required]
    public DateTime Updated { get; set; }

    public override void OnBeforeInsert()
    {
        this.Created = DateTime.Now;
        this.Updated = DateTime.Now;
    }

    public override void OnBeforeUpdate()
    {
        this.Updated = DateTime.Now;
    }
}

答案 1 :(得分:-1)

这个怎么样

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime Created{ get; private set; }


[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime Updated{ get; private set; }