6

データベースに変更を保存しているときに、次の例外が発生します。

Cannot insert the value NULL into column 'Registered', table
'EIT.Enterprise.KMS.dbo.LicenseEntry'; column does not allow nulls.
INSERT fails. The statement has been terminated.

関連するコードの最初のモデル プロパティは次のようになります。

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime         Registered          { get; private set; }

...そして、私が混乱している理由は次のとおりです。私の知る限り、注釈を提供することにより、[DatabaseGenerated(DatabaseGeneratedOption.Identity)Entity Frameworkにフィールドを自動生成するように命令しています(この場合:作成時に1回のみ)。

したがって、EFが処理しているフィールドを手動で変更する可能性なしに、null不可(必須)フィールドを持つことを期待しています。

私は何を間違っていますか?


ノート:

  1. POCO を使用したいので、Fluent-API を使用したくありません。
  2. defaultValueSqlこのプロジェクトにはデータベースに依存しない必要があるため(たとえば、 )、プロパティもオプションではありませんGETDATE()
  3. Entity Framework 6 alpha 3、Code First を使用しています。
4

4 に答える 4

3

これを試して:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime?            Registered          { get; private set; }

疑問符はプロパティを null 可能にします

于 2013-06-11T15:42:24.250 に答える
2

デフォルトの DateTime はありません。最小値のみ。

を呼び出す前に、そのエンティティに日時を設定するだけでよい可能性があります dbContext.SaveChanges

解決策については、これを参照してください。

于 2013-06-11T20:51:47.217 に答える
2

この手法はreadonly、データベースに保持されるフィールドのように動作します。値が設定されると、コードを使用して (簡単に) 変更することはできません。(もちろん、必要に応じてセッターをpublicorに変更しinternalます。)

このコードを使用するクラスの新しいインスタンスを作成するRegisteredと、最初は設定されません。の値が初めてRegistered要求されたときに、値が割り当てられていないことがわかり、デフォルトで になりますDateTime.Now。必要に応じてこれを変更できDateTime.UTCNowます。

データベースから 1 つ以上のエンティティをフェッチする場合、Entity Framework は、このようなセッターRegisteredを含むの値を設定します。private

private DateTime? registered;
[Required]
public DateTime Registered
{
    get
    {
        if (registered == null)
        {
            registered = DateTime.Now;
        }
        return registered.Value;
    }
    private set { registered = value; }
}
于 2014-04-01T19:23:52.060 に答える