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_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() { }
}
}
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)
| 归档时间: |
|
| 查看次数: |
1291 次 |
| 最近记录: |