0

いくつかのテーブルを持つ SQL Server 2008 R2 データベースがあり、各テーブルにはいくつかのトリガーがあります。列の 1 つで、これを Person.Age と呼びます。既定値があるため、明示的に値を指定しない場合、既定値は "18" になります。

    create table PERSON
(
id                              int             IDENTITY(1,1) PRIMARY KEY,
age                             char(2)         DEFAULT '18',
Name                            char(40),   
);

データベースからロードして選択するために、EntityFramework 4.0 (5.0 も試しました) と Visual Studio 2010 を使用しています。次のステートメントを使用してテーブルに挿入するたびに、行が挿入されますが、デフォルト値は完了していません:

var person = new Person
{
   Name = "Peter"
};

using (var ctx = new MyEntities())
            {
                ctx.PERSON.AddObject(person);
                ctx.SaveChanges();
            }

これにより、Peter という名前の行が生成されますが、Age は null に設定され、デフォルトの 18 ではありません。

EDMX ファイルを更新/ロードすると、単純なテーブルとビューしかインポートできないように見え、プロパティをインポートするオプションがないように見えますが、これはデフォルトで行われると思っていましたか? デフォルトのプロパティが起動しない理由はありますか?

また、新しい行が PERSON に挿入されると、追加のテーブルが更新されるように、SQL Server でトリガーを定義しています。繰り返しますが、これはデータベースに対して SQL を直接実行すると機能しますが、EntityFramework を使用して Visual Studio から実行すると機能しません。

ありがとう、

4

1 に答える 1

0

EF は、渡された値に列を明示的に設定します。Person エンティティを作成したとき、 age の値はデフォルトで null に設定されるため、EF は列の値を null に設定するコマンドを送信します。デフォルト値が必要な場合は、ctor にデフォルト値を設定します (それ以外の場合、デフォルト値は、参照プロパティの場合は null で、値型プロパティ (int など) の場合は default(T) です)。

EF デザイナーは、データベースからすべての列を取得し、リバース エンジニアリングされたテーブルと列の値に対応するプロパティを持つエンティティを含むモデルを作成します。次に、デザイナーでモデルを微調整できます。たとえば、不要なプロパティを削除できます。

トリガーの場合、「機能しない」が何を意味するのかわかりません-それはおそらくあなたの期待に依存します. EF はコマンドをデータベースに送信するだけです。したがって、EF が送信するのと同じ Sql コマンドを送信すると、同じように「機能しない」はずです。EFはデータベースにとらわれず、トリガーのようなDBマジックを認識していません。また、通信はEFからDBへの一方向のみです。したがって、データベースが何かについて EF に通知すると予想される場合、それは機能しません。これを行う手段はありません。

于 2013-01-18T22:01:11.607 に答える