gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:57:30 24 4
gpt4 key购买 nike

我有一个代码优先模型:

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

还是我的做法全错了,我应该同时使用另一种方法?

最佳答案

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

这是您的示例的样子。

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;
}
}

关于c# - EF 6 Code First 对象生命周期/信号/事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20692127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com