我知道有很多关于这个话题的帖子,而且我已经阅读了大部分。然而,对我来说有几件事仍然不清楚,并且仍然无法正常工作。
如果我在数据库架构中有一个 DateTime 类型的字段,并且我想要为其分配一个默认值,则应该执行以下操作:
create table [mySchema].[MyTable](
ObjectGuid uniqueidentifier CONSTRAINT Id PRIMARY KEY,
SomeTextToStore nvarchar(128) NULL,
CDate datetime NOT NULL DEFAULT GETDATE(),
CUser nvarchar(64) DEFAULT CURRENT_USER
);
GO
(不知道是否重要:我正在使用SQL Server Express 2014。Fluent配置适用于SQL Server 2012。)
当从ISQL进行INSERT
时,此方法可以正常工作,并插入记录添加的时间戳。
使用Fluent,我会这样写:
领域:
public class MyObject
{
public virtual Guid Id {get; set}
public virtual string SomeTextToStore {get; set;}
public virtual DateTime? CDate {get; set;}
public virtual string CUser {get; set;}
}
注意: 我将CDate变量设为可空!
下面是一个映射类示例:
class MyObjectMap : ClassMap<MyObject>
{
public MyObjectMap()
{
Table("MySchema.MyTable");
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.SomeTextToStore).Length(128).Nullable();
Map(x => x.CDate).Not.Nullable().Default("getdate()");
Map(x => x.CUser).Not.Nullable().Default("CURRENT_USER);
}
}
在程序中(在我的情况下,这是一个可以从多种类型的程序调用的库)我做了如下操作:
public void EnterSomeText()
{
using (var session = sessionManager.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var myObj = new MyObject();
myObj.SomeTextToStore("bla bla bla");
session.SaveOrUpdate(myObj);
transaction.Commit();
}
session.Close();
}
}
这总是导致日期时间溢出异常!(SqlDateTime 溢出。必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间)
看起来不传递值给文件CDate
会导致问题。当我在我的库中添加默认值时,它可以正常工作:
...
myObj.SomeTextToStore("bla bla bla");
myObj.CDate = DateTime.Now; // <---- Set the date here
session.SaveOrUpdate(myObj);
...
但这并不是真正的解决方案...
问题:
- 我做错了什么/遗漏了什么?
- 定义默认值的正确策略是什么?在数据库中还是只在代码中?(当开始一个全新的项目时,我更喜欢从C#代码开始做所有的事情,甚至创建和更新架构...)
- 关于领域类:创建填充字段默认值的构造函数是否明智?
我对字段CUser
这样做是因为我想添加当前用户上下文
public MyObject()
{
var o = System.Security.Principal.WindowsIdentity.GetCurrent();
if (o != null)
{
CUser = o.Name;
}
}
在我的DB访问层库中,我可以在构造函数中填充域类的CDate字段为当前日期,而不是直接在库中进行填充:
public MyObject()
{
var o = System.Security.Principal.WindowsIdentity.GetCurrent();
if (o != null)
{
CUser = o.Name;
}
CDate = DateTime.Now;
}
非常感谢您的帮助和评论!