2

'Item'というエンティティを1つ作成しました。いくつかの必要なデータとともに、Id、CreateDate、ModifyDateを取得しました。

EF4.3コードファーストモデルを使用しています。問題が解決した場合は、最新バージョンのEFを使用してもかまいません。

これら3つの値はすべてオプションです。時々、IdやCreateDateなどの値を渡すことがあります。合格しなかった場合、EFがDBからこれらの値を自動的に生成するようにします。それ以外の場合は、合格した値を取得します。

これまでのところ、Id列をIdentity列として作成すると、指定された値が無視されることがわかりました。計算列についても同じことが言えます。

とにかく、それらの値を提供するオプションはありますか?

もう1つ、日付フィールドを変更しました。レコードを更新するたびに、DBに現在の日時を更新させたい。私は次のオプションを見つけました、しかしどういうわけか私はそれらのどれにも満足していません。DBからの直接オプション(デフォルト値のようなもの)はありますか?

  1. 更新トリガーを使用して、変更日を更新します
  2. C#側でmodifydate値を設定します

私の実体:

public class Item
{  
    public Guid? ItemId { get; set; }

    public string SomeData { get; set; }

    public DateTime CreateDate { get; set; }

    public DateTime? ModifyDate { get; set; }
}
4

2 に答える 2

2

これら3つの値はすべてオプションです。時々、IdやCreateDateなどの値を渡すことがあります。合格しなかった場合、EFがDBからこれらの値を自動的に生成するようにします。それ以外の場合は、合格した値を取得します。

これはEFでは不可能です。EFは次の2つのメカニズムのみをサポートします。

  • 値は常にアプリケーションによって提供されます
  • 値は常に、IDまたは計算された設定のいずれかを使用してデータベースによって提供されます

その理由は、デフォルト値がデータベースによってどのように処理されるかです。これらは、INSERTコマンドが列を明示的に設定しない場合にのみ使用されますが、EFは、IDまたは計算設定でマークされた列を除いて、常にすべての列を明示的に設定します(デフォルトの.NET値が使用されるために値を設定しなかった場合でも)。

したがって、シナリオには3番目のメカニズムが必要です。

  • デフォルト値が存在しないか、.NETのデフォルト値が含まれている場合は、トリガーを使用してデフォルト値を設定します

問題は、プロパティを計算済みまたはIDとしてマークしないと、それらの値が自動的に戻されないことです。新しいレコードを挿入するか、既存のレコードを更新する場合、データベースへの新しいクエリで現在のエンティティを更新しない限り、エンティティインスタンスには古い値(またはデフォルトの.NET値)が含まれます。これが、IDと計算された設定が存在する理由です。つまり、挿入または更新中にこれらの値を自動的に取得します。

EFを使用している場合、これらの変更はすべて、トリガーによってデータベースではなく、アプリケーションで行う必要があります。

于 2012-05-29T08:43:00.017 に答える
0
  • のコンストラクタでデフォルト値を設定できますItem
  • 変更日については、異なるマシンのクロックに依存したくないため、常にデータベーストリガーを使用します。
于 2012-05-29T07:10:29.000 に答える