2013-08-29 11 views
21

EntityFramework 4(EF)を使用してオブジェクトをSQL Serverデータベースに挿入しています。受信テーブルに(CreatedDate)の列があり、デフォルト値はgetdate()に設定されています。だから私はEFにその値がSQL Serverによってgetdate()にデフォルト設定されると仮定してそれを提供しません。EntityFrameworkが既定値で列を更新しない

しかし、これは起こりません。代わりに、EFは検証エラーn SaveChanges()を返します。

この問題が発生している理由がありますか?私にお知らせください。

多くのありがとうございます。

+0

私はこれがあなたに役立つはずだと思いますhttp://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/ – V4Vendetta

+0

ここで最高の定評があります: http://stackoverflow.com/questions/14385477/adding-createddate-to-anentity-using-entity-framework-5-code-first(そうでないかもしれません)。 – Chris

答えて

13

あなたは(作成日と同じように)、その値を編集することはありません場合は、あなたが使用することができます。

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public virtual DateTime CreatedDate { get; set; } 

これは、値はデータベースによって制御されていることをEntity Frameworkのを教えてくれますが、それでもフェッチします値。

この値を変更することはできないので、単に初期値が必要な場合は解決策ではありません。

既定値が必要なだけですが、それでも編集できる場合、またはEntity Framework 5以下を使用している場合は、デフォルトのコードを設定する必要があります。ここでは、この程度

もっと議論:

How to use Default column value from DataBase in Entity Framework?

+0

本当ではありません。あなたはこれを行うことができます。質問に対する私の答えを見てください。 – kkahl

+0

@CptRobbyの答えは – HostMyBus

+0

@kkahlの下に書かれていますが、回答が更新されました – mattmanser

2

ちょうどあなたのエンティティ・オブジェクト定義の列フィールド上に[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性を適用します。例えば

public class SomeTable 
{ 
    ... 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public DateTime CreatedDate { get; set; } 

    ... 
} 

これはあなたの列の初期値は、データベースによって供給されているエンティティフレームワークに指示します。この値は、行挿入後にデータベースから自動的に更新されます。

+0

私のために働いていません - 私のテーブルには3つのデフォルト値があります( 'NEWID()'、 SYSTEM_USER'、 'GETDATE()')、これらのフィールドのそれぞれに '[DatabaseGenerated(DatabaseGeneratedOption.Identity)]'を付けて、 'Validation failed one or more entities。詳細は、「EntityValidationErrors」プロパティを参照してください。 – alex

+0

もちろん、デバッガに入り、(EntityValidationErrorsプロパティの)例外に添付されている追加情報を調べたいと思うでしょう。 EntityFrameworkが単に列の値の1つを解析/理解できない可能性があります。私の経験では、犯人を見つけるためにこれらを一度に追加してみることをお勧めします。私はまた、それはおそらく日付列に関連していると推測しています。これはサポート可能であるべきですが、ミックスで利用可能な日付フォーマットと構造が非常に多いので、正しい取得が難しいかもしれません。 – kkahl

+0

ここで正しい道を歩いている間、正解は@CptRobbyのデータアノテーションを使った答えです: [DatabaseGenerated(DatabaseGeneratedOption.Computed)] – HostMyBus

0

私は新しい変数を宣言し、その変数を現在の時刻に設定しました。次にデータを挿入するときに変数を列に参照しました:

var db = new YourTableEntities(); 
var dateNow = DateTime.Now; 

db.YourTableEntities.Add(new YourTableEntities() 
{ 
    ColumnAInTable = someAVariable, 
    ColumnBInTable = someBVariable, 
    ColumnThatShouldDefaultToGetDate = dateNow 
}); 

2

この問題に対する正解は、列がComputedであることをEntity Frameworkに伝えることです。

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public virtual DateTime CreatedDate { get; set; } 

DatabaseGeneratedOption.Computedそれがデータベースで設定され、Entity Frameworkので変更することはできないことを意味します。 DatabaseGeneratedOption.Identityは、カラムがIDENTITYカラムであることを意味します。これは、数値の主キーを自動インクリメントするためにのみ使用してください。

** DatabaseGeneratedOption enumerationのドキュメントには、IDENTITY列については何も言及されていません(これはSqlServer固有の実装の詳細な部分もあります)。代わりに、「行が挿入されたときにデータベースが値を生成する」という識別オプションを定義します。レコードを作成するときにDEFAULT制約を使用してModDateを設定できるようにする方法を探していましたが、レコードを更新するときにEntity Frameworkから変更できるようにしました。だから説明のために、私は解決策を見つけたかもしれないと思ったが、DatabaseGeneratedOption.Identityというフラグが立てられたレコードのModDateを変更しようとすると例外がスローされた。だからそこには運がない。

関連する問題