为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英3389331 2019-12-26 14:17:41
如果我有以下实体:public class PocoWithDates{   public string PocoName { get; set; }   public DateTime CreatedOn { get; set; }   public DateTime LastModified { get; set; }}对应于具有相同名称/属性的SQL Server 2008表...我如何自动:将记录的CreatedOn / LastModified字段设置为现在(执行INSERT时)将记录的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方式)有任何想法吗?
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

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


首先,为了使解决方案更可重用,我创建了带有timestamp属性的基类:


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();

    }

}


查看完整回答
反对 回复 2019-12-26
  • 3 回答
  • 0 关注
  • 607 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信