gpt4 book ai didi

c# - Entity Framework /SQL 2008 - 如何自动更新实体的上次修改字段?

转载 作者:IT王子 更新时间:2023-10-29 03:56:19 25 4
gpt4 key购买 nike

如果我有以下实体:

public class PocoWithDates
{
public string PocoName { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime LastModified { get; set; }
}

它对应于具有相同名称/属性的 SQL Server 2008 表...

我如何自动:

  1. 将记录的 CreatedOn/LastModified 字段设置为现在(执行 INSERT 时)
  2. 将记录的 LastModified 字段设置为now(执行 UPDATE 时)

当我说自动时,我的意思是我希望能够做到这一点:

poco.Name = "Changing the name";
repository.Save();

不是这个:

poco.Name = "Changing the name";
poco.LastModified = DateTime.Now;
repository.Save();

在幕后,“某物”应该自动更新日期时间字段。那个“东西”是什么?

我正在使用 Entity Framework 4.0 - EF 是否可以自动为我执行此操作? (也许是 EDMX 中的特殊设置?)

从 SQL Server 端,我可以使用 DefaultValue,但这只适用于INSERT's(不适用于 UPDATE's)。

同样,我可以使用 POCO 上的构造函数设置默认值,但这同样只在实例化对象时有效。

当然我可以使用触发器,但这并不理想。

因为我使用的是 Entity Framework,所以我可以连接到 SavingChanges 事件并在此处更新日期字段,但问题是我需要“意识到”POCO(目前,我的存储库是用泛型实现的)。我需要做一些面向对象的技巧(比如让我的 POCO 实现一个接口(interface),并在上面调用一个方法)。我对此并不反对,但如果我必须这样做,我宁愿手动设置字段。

我主要是在寻找 SQL Server 2008 或 Entity Framework 4.0 解决方案。 (或智能 .NET 方式)

有什么想法吗?

编辑

感谢@marc_s 的回答,但我选择了一个更适合我的场景的解决方案。

最佳答案

我知道我参加聚会有点晚了,但我刚刚为我正在从事的项目解决了这个问题,我想我会分享我的解决方案。

首先,为了使解决方案更易于重用,我创建了一个具有时间戳属性的基类:

public class EntityBase
{
public DateTime? CreatedDate { get; set; }
public DateTime? LastModifiedDate { get; set; }
}

然后我覆盖了 DbContext 上的 SaveChanges 方法:

public class MyContext : DbContext
{
public override int SaveChanges()
{
ObjectContext context = ((IObjectContextAdapter)this).ObjectContext;

//Find all Entities that are Added/Modified that inherit from my EntityBase
IEnumerable<ObjectStateEntry> objectStateEntries =
from e in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
where
e.IsRelationship == false &&
e.Entity != null &&
typeof(EntityBase).IsAssignableFrom(e.Entity.GetType())
select e;

var currentTime = DateTime.Now;

foreach (var entry in objectStateEntries)
{
var entityBase = entry.Entity as EntityBase;

if (entry.State == EntityState.Added)
{
entityBase.CreatedDate = currentTime;
}

entityBase.LastModifiedDate = currentTime;
}

return base.SaveChanges();
}
}

关于c# - Entity Framework /SQL 2008 - 如何自动更新实体的上次修改字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3879011/

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