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

 手机用户2502929967 发布于 2023-02-09 09:39

我有一个代码优先模型:

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修改对象前/后保存.

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

1 个回答
  • 是的,您可以插入自定义的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;
        }
    }
    

    2023-02-09 09:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有