小编典典

实体框架/ SQL2008-如何自动更新实体的LastModified字段?

c#

如果我有以下实体:

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字段设置为 现在 (执行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 (而不是UPDATE)。

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

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

因为我使用的是Entity Framework,所以我可以在这里挂入 SavingChanges 事件并更新日期字段,但是问题是我需要“意识到”
POCO(目前,我的存储库已使用泛型实现)。我将需要进行某种OO欺骗(例如使我的POCO实现一个接口,并在该接口上调用一个方法)。我对此并不反对,但是如果我必须这样做,我宁愿手动设置字段。

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

有任何想法吗?

编辑

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


阅读 238

收藏
2020-05-19

共1个答案

小编典典

由于我在我的控制器(即使用ASP.NET MVC)和我的存储库之间进行中介的服务层,因此我决定在此处自动设置字段。

另外,我的POCO没有关系/抽象,它们是完全独立的。我想保持这种方式,而不要标记任何虚拟属性或创建基类。

所以我创建了一个接口IAutoGenerateDateFields:

public interface IAutoGenerateDateFields
{
   DateTime LastModified { get;set; }
   DateTime CreatedOn { get;set; }
}

对于任何希望自动生成这些字段的POCO,我都实现了此接口。

使用我的问题中的示例:

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

现在,在我的服务层中,检查具体对象是否实现了接口:

public void Add(SomePoco poco)
{
   var autoDateFieldsPoco = poco as IAutoGenerateDateFields; // returns null if it's not.

   if (autoDateFieldsPoco != null) // if it implements interface
   {
      autoDateFieldsPoco.LastModified = DateTime.Now;
      autoDateFieldsPoco.CreatedOn = DateTime.Now;
   }

   // ..go on about other persistence work.
}

稍后,我可能会在“添加到帮助器/扩展程序”方法中破坏该代码。

但是我认为这对我的情况来说是一个不错的解决方案,因为我不想在“保存”中使用虚拟机(因为我正在使用工作单元,存储库和Pure POCO),并且不想使用触发器。

如果您有任何想法/建议,请告诉我。

2020-05-19