繁体   English   中英

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

[英]LINQ to SQL, not null, use default value

我正在使用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属性并让数据库生成默认值,我需要做什么?

你是说你希望dob字段允许空值或你想要dob是一个默认值?

如果它是默认值,我认为你应该弹出以下内容来设置person类中的日期

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;}

实际上,.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日期出现溢出错误。

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

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

编辑:

由于您使用的是基于Linq to Sql的EF,因此IsDataBaseGenerated您期望的那样支持IsDataBaseGenerated属性,相反,有一篇很棒的文章描述了具有数据库生成属性的工作流。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM