![](/img/trans.png)
[英]Linq to SQL: Load default field Values ONLY for fields with NULL value
[英]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.