2011-07-27 7 views
9

データベースにヌルにはできない列があり、の既定値を設定したいとします。問題は、エンティティフレームワークがデフォルト値自体(int => 0など)を作成しているように見え、データベースのデフォルト値の制約を完全に無視するということです。エンティティフレームワークの既定値の生成を無効にする(コードファースト)

エンティティフレームワークのこのデフォルト値を無効にする方法はありますか?

答えて

3

ネイティブに、Entityフレームワークはこれを許可しません。あなたはそれにいくつかのコードを行う必要があります。 This answer from another siteは多くの人々にとって問題を解決したようです。

public partial class YourEntityClass { 
    public YourEntityClass() { 
     this.PropertyNameWithDefaultValue = default(int); 
    } 
} 

注1:誰かがそれはEF4では動作しない可能性があることに言及

個人的なメモを:申し訳ありませんが私の英語のためにそのような何かを行うことによって

は彼「ハック」それ(彼が語ったように)私は通常、フランス語を話します。

+1

この例を有効に更新しました。これは正解であり、すべてのEFバージョンで動作します。 EFは、アプリケーションから設定できるプロパティのデータベースのデフォルト値を使用しません。これは設計によるものです。 –

+0

私の答えを修正するために@ Ladislavに感謝します。 –

+0

だから、私が望むことをする方法はありません。ご回答有難うございます。 –

0

EDMXモデルを更新して、[プロパティ]ウィンドウで任意の列のデフォルト値を変更できます。ただし、Entity Frameworkは自動的にDEFAULTの制約を受け取りません。それを行う方法があるかどうかはわかりません。

3

EFが自動的に実行しないものを手動で行う必要があることがあります。 EF 4.1を使用した場合には

は、「コードファースト」は、私は通常IDatabaseInitializer由来分離クラスDbInitializerを作成し、InitializeDatabaseメソッドの実装では、ただの静的コンストラクタで今すぐ

context.Database.ExecuteSqlCommand("ALTER TABLE TABLENAME ... "); 

を呼び出しますそれはDML/DDLはちょうど私たちが望むようにDBがあることを確認するために、テーブル/列を変更するためのコマンドの任意のデータベースを指定することが可能ですが、このように

Database.SetInitializer(new DbInitializer()); 

:DbContextから派生したクラスは、単に初期化子を呼び出します。

+1

ありがとう、これも便利でした。投票はまだできません。 –

6

フィールドを次の属性で飾ることができることがわかりました。

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
3

EFの "Computed"フィールドは、SQLのデフォルト値を持つフィールドと同じではありません。計算フィールドは、サーバー上で計算されるフィールドであり、オブジェクトの送信時には変更しないでください。フィールドにComputedタグを置くと、最初にオブジェクトを作成したときにデフォルト値が取得されますが、後でそのフィールドを変更することはできません。したがって、DBからエンティティを取得して計算フィールドを変更し、エンティティコンテキストで「saveChanges()」を呼び出すと、そのフィールドはDB内で変更されません。

EDMデフォルトでは、EDMXエディタで属性のデフォルト値を設定する方がよい。

エンティティフィールドとデータベースフィールドの間に1対1のマッピングがある場合、EDMXアップデータはフィールドのデフォルト値を読み取ることができません。

+0

私たちはコードファーストを使っていました:( –