LINQ to SQL,而不是null,使用默认值

时间:2013-10-02 09:17:36

标签: c# entity-framework linq-to-sql

我正在使用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; }
}

我遇到的问题是,当我想使用DB生成的'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属性并让数据库生成默认值,我需要做什么?

3 个答案:

答案 0 :(得分: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;}

答案 1 :(得分: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字段。在此cas中,您必须在数据库中授权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日期出现溢出错误。

答案 2 :(得分:-1)

尝试将Column(IsDataBaseGenerated=true)添加到id列。

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

编辑:

由于您使用的是基于Linq to Sql的EF,因此不支持IsDataBaseGenerated属性,而是有great article描述具有数据库生成属性的工作流