3

DB FirstでEFを使用しています。私のテーブルは次のようになります。

CREATE TABLE [dbo].[Person](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](50) NOT NULL,
    [dob] [datetime] NOT NULL 
    CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED )
GO
ALTER TABLE [dbo].[Person] 
    ADD  CONSTRAINT [DF_Person_dob]  DEFAULT ('12.12.3000') FOR [dob]

DB First を使用した後、次の部分的な Person クラスを取得します。

using System;

public partial class Person
{
    public int id { get; set; }
    public string name { get; set; }
    public System.DateTime dob { get; set; }
}

私が抱えている問題は、「dob」フィールドに DB で生成されたデフォルト値を使用したい場合に、null が許可されていないために例外が発生することです。私はこれをやろうとしています:

 using (var db = new NullTestEntities())
 {
     var person = db.Person.Create();
     person.name = "John Doe";
     db.Person.Add(person);
     db.SaveChanges();
 }

追加してみました

 Column(IsDataBaseGenerated=true)

エラーが発生するため、コンパイルできません。

「System.ComponentModel.DataAnnotations.Schema.ColumnAttribute」には「IsDatabaseGenerated」の定義が含まれていません

C# コードで dob 属性を定義せず、データベースにデフォルト値を生成させるにはどうすればよいですか?

4

3 に答える 3

2

dob フィールドで null を許可したいのか、それとも dob をデフォルト値にしたいのか?

デフォルト値の場合、個人クラスで日付を設定するには、次をポップする必要があると思います

public partial class Person
{
    public Person(){
        dob = DateTime.Now; // or whatever
    }

    public int id { get; set; }
    public string name { get; set; }
    public System.DateTime dob { get; set; }
}

null を許可したいという場合は、dob を次のように変更します。

public Nullable<DateTime> dob {get;set;}   

また

public DateTime? dob {get;set;}
于 2013-10-02T09:48:16.060 に答える
0

実際、.Net DateTime と SQL の datetime 型は完全には互換性がありません。.Net の最小日時は 0000/01/01 ですが、SQL の最小日時は 1753/01/01 です。

datetime の代わりに datetime2 SQL タイプの使用を試みることができます: http://msdn.microsoft.com/en-us/library/bb677335.aspx。このタイプでは、最小日付は .Net のものと同じです。

Nullable DateTime を指定して、dob フィールドで回避策を試すこともできます。( DateTime?)。オブジェクトをインスタンス化するDateTime.Minと、Person クラスの dob フィールドに が自動的に設定されます。この場合、データベースで NULL 値を承認する必要があります。

最終的にそのようなパターンを使用できます:

private DateTime _dob;

// Field bind to your DataModel in the EDMX
private SqlDateTime coreDob
{
    get
    {
        if (_dob < SqlDateTime.MinValue)
            _dob = (DateTime)SqlDateTime.MinValue;

        return _dob;
    }
    set
    {
        if (value < SqlDateTime.MinValue)
            _dob = (DateTime)SqlDateTime.MinValue;
        else
            _dob = (DateTime)value;
    }
}

// Field use in your code
public DateTime dob
{
    get { return _dob; }
    set
    {
        if (value < SqlDateTime.MinValue)
            _dob = (DateTime)SqlDateTime.MinValue;
        else
            _dob = value;
    }
}

この種のパターンは、SQL 日付のオーバーフロー エラーを防ぎます。

于 2013-10-02T09:32:46.280 に答える
-1

Column(IsDataBaseGenerated=true)id 列に追加してみてください。

また、SQLデータベースdobにあるため、挿入前にプロパティを設定する必要があります。NOT NULL

編集:

Linq to Sql で EF を使用しているため、IsDataBaseGeneratedプロパティは期待どおりにサポートされていません。代わりに、データベースで生成されたプロパティを使用したワークフローを説明する優れた記事があります。

于 2013-10-02T09:22:28.690 に答える