如果我有以下实体:
public class PocoWithDates {
public string PocoName { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateUpdated { get; set; }
}
对应于具有相同名称/属性的 SQL Server 2008 (R2) 表...
我怎样才能自动:
- 在执行 INSERT 时将 DateCreated
和 DateUpdated
字段设置为现在
- 在执行更新时将 DateUpdated
字段设置为现在
当我自动说时,我的意思是我希望能够做到这一点:
poco.Name = "Changing the name";
repository.Save();
不是这个:
poco.Name = "Changing the name";
poco.LastModified = DateTime.Now;
repository.Save();
在幕后,“某物”应该自动更新 DateTime 字段。那个“东西”是什么?我正在使用 Entity Framework 6.0。有没有一种方法可以让 EF 自动执行此操作?我知道 MySQL 可以做这样的事情。或者在 SQL Server 中使用触发器/存储过程。但我不想要那样。
这个问题是这个问题的替代和修改版本: Entity Framework/SQL2008 - How to Automatically Update LastModified fields for Entities?
这个问题为 EF 4.0 提供了一些很好的解决方案/答案。但我希望它用于带有 DBContext
的 EF6.0。如果我有更多时间,我会尝试调整这些解决方案并让它们在 EF6.0 中工作。但现在我想知道是否有人已经解决了这个问题,或者知道如何将 EF4.0 的自定义 SaveChanges()
或 Add()
覆盖转录到 EF6.0 .
最佳答案
您可以覆盖 DbContext 上的 SaveChanges() 方法以更新 Save() 上的 DateUpdated 值。我会实现一个接口(interface)来允许更新某些项目,而其他项目则不允许。
public interface IEntityAutoDateFields
{
DateTime DateCreated { get; set; }
DateTime DateUpdated { get; set; }
}
然后:
public class PocoWithDates : IEntityAutoDateFields
{
public PocoWithDates()
{
}
public DateTime DateCreated { get; set; }
public DateTime DateUpdated { get; set; }
}
在您的上下文中:
public PocoWithDatesContext : DbContext
{
public DbSet<PocoWithDates> PocoWithDatesSet { get; set;}
public override int SaveChanges()
{
var now = DateTime.Now;
this.ChangeTracker.DetectChanges();
foreach (var item in this.ChangeTracker.Entries()
.Where(i => i.State == EntityState.Added || i.State == EntityState.Modified)
.Where(i => i as IEntityAutoDateFields != null))
{
if (item.State == EntityState.Added)
{
(item as IEntityAutoDateFields).DateCreated = now;
}
(item as IEntityAutoDateFields).DateUpdated = now;
}
// Call the SaveChanges method on the context;
return base.SaveChanges();
}
}
关于c# - 如何自动设置 DateCreated 和 DateUpdated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21912058/