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

sam*_*sam 3 .net c# 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sta*_*tan 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() { }
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)