2017-02-05 49 views
0

私はEFデータベースを最初に使用しています更新日を設定します

私は '日付更新'の列を持つテーブルを持っています。レコードが更新されると、現在のdatetimeが必要です。私はEFを使用しているので、自動生成されたモデルクラスは編集できません。私はEFをアップグレードすると上書きされると仮定しているので、私はT4テンプレートを編集したくないです

私はこれに従った別の問題を解決するために:http://www.ozkary.com/2015/01/add-data-annotations-to-entity.html私はちょうど私が言うことができる自動生成されたEFクラス

それで、私はこれに答えました:set default value in class constructor C#これは私が必要とする解決策を示すようです。しかし、私がテストすると、DateUpdatedは変更されません。

私の自動生成されたクラスの一部です。

namespace bt2.Models 
{ 
    [MetadataType(typeof(TaskMD))] 
    public partial class Task 
    { 
    } 

    internal sealed class TaskMD 
    { 
     [DisplayName("ID")] 
     public int Task_ID { get; set; } 

     [DisplayName("Task Type")] 

     public int TaskType_ID { get; set; } 

     public System.DateTime DTUpdated { 
      get { return DateTime.Now; } 
      set { this.DTUpdated = value; } 
     } 
    } 

私の知る限りは、この第二のクラスが拡張されて言うことができるように:あなたはDTUpdated

namespace bt2.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Task 
    { 
     public int Task_ID { get; set; } 
     public int TaskType_ID { get; set; } 
     public int Emp_ID { get; set; } 
     public System.DateTime DTInserted { get; set; } 
     public System.DateTime DTUpdated { get; set; } 

     public virtual TaskType TaskType { get; set; } 
     public virtual Task Tasks1 { get; set; } 
     public virtual Task Task1 { get; set; } 
    } 
} 

ここでは、ここで私は自動生成されたクラスに余分なコードを追加しようとした私の「相棒」クラスだ見ることができます元のクラス

私は自分の問題を解決したいと思っていますが、ここで何が起こっているのかさらに理解したいと思います。

答えて

0

Contextクラスを使用すると、SaveChangesメソッドのオーバーロードを使用して独自の部分クラスを作成することができる部分クラスなので。

この方法では、リフレクションを使用してDTUpatedプロパティを取得し、更新日時値を設定できます。 (名前がパラメータと同じでない場合は、プロパティの名前が同じである場合)

次のようなものです。

public partial class TBCompanyEntities 
{ 

    public void SaveChanges(object o) 
    { 
     try 
     { 
      var propertyInfo = o.GetType().GetProperty("DTUpdated"); 

      // This hasn't been tested by me yet - will test and update if need changes 
      if(propertyInfo != null) 
       propertyInfo.SetValue(o, Convert.ChangeType(DateTime.UtcNow, propertyInfo.PropertyType), null); 
     } 
     catch (Exception ex) 
     { 
      // Logging.Log.Error(ex); 
     } 

     base.SaveChanges(); 

    } 
} 

そして、代わりにdbContxt.SaveChanges();を呼び出すコードの中で、あなたが呼び出すことができます

dbContext.SaveChanges(YOUR_ENTITY_OBJECT); 

例:

  using (var dbContext = new TBCompanyEntities()) 
      { 
       // Entity with DTUpdated 
       var notification = dbContext.NotificationArchives.First(s => s.iNotificationId == 1); 
       notification.bIsRead = true; 
       dbContext.SaveChanges(notification); 

       //Entity without DTUpdated 
       var asset = dbContext.Assets.First(s => s.iAssetId == 1); 
       asset.iDriverId = null; 
       dbContext.SaveChanges(); 
      } 

EDIT:

オーバーライドされたときのパラメータオーバーライドされたメソッドは基本メソッド。

ですから、このような何か行う必要があります。ここ

public partial class TBCompanyEntities 
{ 

    public override void SaveChanges() 
    { 
     //TODO: Here you will have to detect which entity has been modified/updated. 
     // This should be possible, by using the Track Entity Changes features 

       var modifiedEntities = ChangeTracker.Entries() 
     .Where(p => p.State == EntityState.Modified).ToList(); 


     base.SaveChanges(); 

    } 
} 

は、著者がエンティティへの変更を追跡して、ログを作成するオーバーライドの良いリンクです。 (監査ログのような)

https://www.exceptionnotfound.net/entity-change-tracking-using-dbcontext-in-entity-framework-6/

+0

これは良い方法です。また、単にSaveChangesメソッドをオーバーライドし、現在のdatetimeをUpdatedTimeフィールドに設定することもできます。 – Teja

+0

はい - すべてのテーブルにDTUpdatedカラムがない場合 - OPが既存のメソッドを保持したい場合 –

+0

これはすでに正しく処理されています! if(propertyInfo!= null)は、プロパティが存在することを示します。それが存在しなければ、それは気にしません。私は同様のロジックを使用しました。 – Teja

0

私はそこに何が起こっているのか全くわからないが、ここでいくつかの提案は以下のとおりです。

  1. あなたは、各エンティティとエンティティの各プロパティに属性を生成することができます。少し複雑ですし、エンティティのキ​​ーを生成することさえできます。そのクラスの拡張とメタデータの作成を省略できます。これは、データベーススキーマを反映します。私はこのアプローチを自分のプロジェクトで使い、それがうまくいった。

  2. T4テンプレートを使用して自動生成されるファイルは、一部の変更があり、すべてのエンティティを再生成しない限り、1回限りのイベントです。したがって、プロジェクト内で生成されたエンティティのみを切断して使用することをお勧めします。

+0

フィードバックに感謝いたします。これはデータベースの最初のものなので、データベースが変更されるとエンティティは確実に将来再生成されます。 –

関連する問題