我正在使用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属性并让数据库生成默认值,我需要做什么?
答案 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描述具有数据库生成属性的工作流