2

日時フィールドを持つモデルがあります。

私のコードは、これを設定してこのフィールドを現在にリセットするモデルで動作しています。しかし、今は「設定」するのではなく、「保存」したいのです。つまり、 を設定するfield1 = now [0:00:00]と、10 秒になります。その後field2 = now [0:00:10]、10秒。後で、I SaveChanges()'d like to have both field set to 0:00:20 (時間を節約) を実行します。

編集: コード例:

var context = new SomeEntities();
SomeModel model = context.GetSomeModel(...);
// SomeModel has two DateTime fields: dt1 and dt2
model.dt1 = SavingDateTimeNow(); // .... 13:42:00
// some code, i.e. Sleep(TimeSpan.FromSeconds(10));
model.dt2 = SavingDateTimeNow(); // .... 13:42:10
// again 10s. code
context.SaveChanges(); // .... 13:42:20

Edit2:より複雑な例:

var context = new SomeEntities();
SomeModel model = context.GetSomeModel(...);
// SomeModel has two DateTime fields: dt1 and dt2
if(someComplexCondition)model.dt1 = SavingDateTimeNow(); // .... 13:42:00
// some code from which I would know if someOtherComplexCondition is true
if(someOtherComplexCondition)model.dt2 = SavingDateTimeNow(); // .... 13:42:10
// again 10s. code
// much more code here
context.SaveChanges(); // .... 13:42:20

両方 (dt1 と dt2) を ... 13:42:00 と 13:42:10 ではなく 13:42:20 に設定したい

Edit3: 最も単純な例: django のフィールドと同じように動作するようにしたいと思いますauto_now=True

4

4 に答える 4

0

ああ、変更された複数のモデルがあり、保存時にDateTimeを設定する必要があるかもしれません。

この場合、ブールフラグ(setDt1およびSetDt2)をモデルにプッシュし、変更を加えるときにそれらのモデルをリストに追加するか、またはのタプルを<model,bool,bool>リストに追加します。

この質問を見てください。EntityFrameworkでオブジェクトに加えられたすべての変更を取得して、それらの保存されたモデルをループして、変更されたプロパティを表示する例を確認してください。

エンティティのEntityStateをチェックして、追加されたエンティティを取得できます。

var addedStateEntries = Context.ObjectStateManager.GetObjectStateEntries(EntityState.Added);

およびで変更されたエンティティ

var modifiedStateEntries = Context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);

dt1またはdt2を適切に保存および設定する準備ができたら、それらをループできます。


私が正しく理解しているならDateTime.Now、あなたはあなたがsaveChanges()

そのシナリオcontext.SaveChanges()では、への呼び出しを以下のメソッドへの呼び出しに置き換えます

private void SaveModel(SomeEntities context, SomeModel model bool setDt1, bool setDt2) {
  DateTime instant = DateTime.Now;
  if (SetDt1) { model.dt1 = instant; }
  if (setDt2) { model.dt2 = instant; }
  context.SaveChanges();
}

より複雑な例を見てみましょう...保存時に日付を設定する必要があるかどうかがわかったら、フラグを設定します。SavingDateTimeNow()dt1をNowに設定するだけでなく、他のタスクを実行するかどうかわからないため、そのままにしておきました。

var context = new SomeEntities();
SomeModel model = context.GetSomeModel(...);
var setDt1 = false;
var setDt2 = false;

// SomeModel has two DateTime fields: dt1 and dt2
if(someComplexCondition) {
 model.dt1 = SavingDateTimeNow(); // .... 13:42:00
 setDt1 = true;
}
// some code from which I would know if someOtherComplexCondition is true
if(someOtherComplexCondition) {
  model.dt2 = SavingDateTimeNow(); // .... 13:42:10
  setDt2 = true;
}
// again 10s. code
// much more code here
SaveModel(context, model, setDt1, setDt2); // .... 13:42:20
于 2012-09-28T11:48:54.470 に答える
0

これは完全な答えではありませんが、考えるべきいくつかのヒントです。

  1. およびのStoreGeneratedPatternプロパティを設定し、データベース レベルでこの状況を処理できます。dt1dt2Computed
  2. デフォルト値をgetdate()データベース レベルに設定できます。指定されていない新しいレコードのdt場合は、現在に設定されます。
于 2012-09-28T12:05:07.417 に答える
0

オブジェクト モデルを拡張して、SaveDateTime プロパティを含めてみませんか。次に、次を使用します。

dt1.SaveDateTime = true;

SaveChanges() を呼び出すと、すべての正のフラグが現在の DateTime に更新されます (後でリセットすることを忘れないでください)。

于 2012-09-28T12:26:16.767 に答える
0

完璧ではない解決策を見つけました (より良い解決策を見つけた場合は、ここに投稿してください)。記事全文は次のとおりです: Dave Dunkin のブログ: Entity Framework の自動タイムスタンプ

アイデアは次のとおりです。

  1. この機能を必要とするモデルのインターフェースを作成する
  2. インフラストラクチャを実装する
  3. 変更されたすべてのエンティティを通過するメソッドをエンティティに作成し、インターフェイスを実装するエンティティをチェックし、その日時フィールドを変更します (このインターフェイスのメソッドによって実行できます)。
  4. このメソッドをエンティティの SavingChanges イベントに追加します
于 2012-09-28T13:29:47.783 に答える