亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

實體框架/ 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 關注
  • 689 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號