如果我有以下实体:
public class PocoWithDates { public string PocoName { get; set; } public DateTime CreatedOn { get; set; } public DateTime LastModified { get; set; } }
对应于具有相同名称/属性的SQL Server 2008表…
我如何 自动 :
当我 自动 说时,我的意思是我希望能够做到这一点:
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的回答,但是我选择了一个对我的场景更好的解决方案。
由于我在我的控制器(即使用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),并且不想使用触发器。
如果您有任何想法/建议,请告诉我。