3

我将 EF 与 DB First 一起使用。我的表如下所示:

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”字段使用数据库生成的默认值时,我得到一个异常,因为不允许使用空值。我正在尝试这样做:

 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 字段允许空值还是希望 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; }
}

如果您说要允许空值,则将 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。

您可以尝试使用 datetime2 SQL 类型而不是 datetime :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 列。

此外,您必须dob在插入之前设置属性,因为它NOT NULL在 sql 数据库中。

编辑:

由于您在 Linq to Sql 上使用 EF,因此该IsDataBaseGenerated属性不受您期望的方式支持,相反,有一篇很棒的文章描述了使用数据库生成的属性的工作流。

于 2013-10-02T09:22:28.690 回答