5

次のように定義されCreatedDateた、テーブルに列が必要です。Accounts

CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE()

これは、クラスの CreatedDate プロパティにマップされます。

public class Account
{
    public DateTime? CreatedDate { get; private set; }
    // ... other properties ...
}

新しいアカウントを作成するときは、CreatedDate を NULL に設定したままにして、データベースに入力させたいと思います。既存のアカウントを DB から読み込むときは、データベースで生成された CreatedDate を EF に取得させたいと思います。

明示的な移行で EF 4.3 コード ファーストを使用しています。EF が Accounts テーブルの移行を生成したときに、次のように変更しました。

CreatedDate = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),

残念ながら、EF 4.3 を使用してテーブルをマップしようとすると、EF は CreatedDate 列に値 NULL を挿入しようとします。

Ladislav Mrnka の提案に従って、プロパティに DatabaseGeneratedOption.Identity を設定してみました。ただし、これにより、主キー プロパティから ID オプションが削除されます。代わりに DatabaseGeneratedOption.Computed を使用してみましたが、引き続き NULL を挿入しようとします。すべての移行を元に戻し、再実行しましたが、問題は引き続き発生します。

これが私がやっていることですOnModelCreating

modelBuilder.Entity<Account>().Property(a => a.CreatedDate)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

誰か提案はありますか?

助けてくれてありがとう、
リチャード

4

1 に答える 1

4

エンティティで日付を null 不可にするか、データベースで null 可能にします。データベースのデフォルト値は、insert ステートメントが明示的な値を送信しない場合にのみ使用されます。EF の場合、これは でマークした場合にのみ発生CreatedDateしますDatabaseGeneratedOption.Identity。主キーからデフォルト ID を削除する場合は、データ注釈または流暢な API を使用して手動で強制します。

于 2012-05-23T07:26:49.960 に答える