我有一个代码优先模型:
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_save
或django.models.signals.post_save
修改对象前/后保存.
或者我说这一切都错了,我应该一起使用另一种方法?
是的,您可以插入自定义的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; } }