我的数据库表中有一个这样的列
DateCreated, datetime, default(GetDate()), not null
我正在尝试使用Entity Framework在此表上执行插入,如此...
PlaygroundEntities context = new PlaygroundEntities();
Person p = new Person
{
Status = PersonStatus.Alive,
BirthDate = new DateTime(1982,3,18),
Name = "Joe Smith"
};
context.AddToPeople(p);
context.SaveChanges();
当我运行此代码时,我收到以下错误
The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated.
所以我尝试将StoreGeneratedPattern设置为计算...同样的事情,然后身份......同样的事情。有什么想法吗?
答案 0 :(得分:9)
您必须手动编辑edmx xml并将SSDL StoreGeneratedPattern属性设置为identity或computed。但是,每当您通过设计人员更新edmx时,您的更改都将被覆盖。
这是一个已知问题。有关详细信息,请参阅以下链接:
答案 1 :(得分:4)
我遇到了同样的问题!对我来说,它的工作原理如下:
数据库MS SQL Server express:
[RowTime] [datetime2](7) NOT NULL
ALTER TABLE [dbo].[Table_1] ADD CONSTRAINT [DF_Table_1_RowTime] DEFAULT (getdate()) FOR [RowTime]
GO
然后我将表从数据库导入到我的实体模型。 实体将无法实现默认值! 因此,您必须将列的StoreGeneratedPattern设置为Computed。 然后实体将不再存在任何默认值。
组合:
datetime2,
NOT NULL,
StoreGeneratedPattern=Computed
适合我!
答案 2 :(得分:2)
将DateCreated的类型更改为datetime2可能会解决问题。
datetime 2007-05-08 12:35:29.123
datetime2 2007-05-08 12:35:29 12345
参考:http://technet.microsoft.com/en-us/library/bb677335.aspx67
答案 3 :(得分:2)
这是一个有效的解决方法:
1)如其他地方所述,将列更改为datetime2。这可以修复转换错误。
2)添加一个触发器,将DateCreated设置为getdate();
CREATE TRIGGER [TR_AS_ChangeTime] ON [AS_ApplicationSession]
AFTER INSERT,UPDATE AS
BEGIN
SET NOCOUNT ON;
UPDATE AS_ApplicationSession
SET AS_ChangeTime = getdate()
WHERE AS_Id IN(SELECT AS_ID FROM INSERTED)
END
3)如有必要,请设置
p.DateCreated = DateTime.MinValue;
只是为了初始化它。
4)如果您需要数据库中的DateCreated,请添加
context.Refresh(System.Data.Objects.RefreshMode.StoreWins, p);
之后
context.SaveChanges();
答案 4 :(得分:1)
关注我不想更改数据库的事实,因为它是一个应用程序问题,我希望它们有一天能解决这个问题,我的解决方案(在我的情况下完全可能)是创建一个部分类修正构造函数问题的模型:
public partial class Log
{
public Log()
{
this.Date = DateTime.Now;
}
}
这对我有用,因为:
不要忘记命名空间需要匹配模型命名空间或部分不应该列出属性(也不应该是部分属性;))!