【发布时间】:2015-12-26 08:06:31
【问题描述】:
我正在使用 EntityFramework 7,beta7 并具有以下实体:
C#
public class Log
{
[Column(TypeName ="datetime")]
public DateTime Date { get; set; }
...
}
SQL
CREATE TABLE [dbo].[Logs] (
[Date] [datetime] NOT NULL,
...
)
我执行以下操作:
db.Logs.Add(new Log { Date = DateTime.UtcNow });
db.SaveChanges();
这在 Windows 上是成功的,但在 debian 上的 mono 下失败。相同的 SQL 服务器/数据库。生成的 SQL 如下。注意@p1 渲染的类型和值的区别:
Windows
exec sp_executesql N'SET NOCOUNT OFF;
INSERT INTO [Logs] ([Browser], [Date], [Exception], [HostAddress], [Level], [Logger], [Message], [Thread], [Url], [Username])
OUTPUT INSERTED.[Id]
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9);
',N'@p0 nvarchar(max) ,@p1 datetime2(7),@p2 nvarchar(max) ,@p3 nvarchar(max) ,@p4 nvarchar(4000),@p5 nvarchar(4000),@p6 nvarchar(4000),@p7 nvarchar(4000),@p8 nvarchar(max) ,@p9 nvarchar(max) ',@p0=NULL,@p1='2015-09-28 23:02:26.0367851',@p2=NULL,@p3=NULL,@p4=N'INFO',@p5=N'Fanatics.ConsoleApp.Program',@p6=N'Console app test',@p7=N'0',@p8=NULL,@p9=NULL
go
Linux
exec sp_executesql N'SET NOCOUNT OFF;
INSERT INTO [Logs] ([Browser], [Date], [Exception], [HostAddress], [Level], [Logger], [Message], [Thread], [Url], [Username])
OUTPUT INSERTED.[Id]
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9);
',N'@p0 nvarchar(4000), @p1 char(27), @p2 nvarchar(4000), @p3 nvarchar(4000), @p4 nvarchar(4000), @p5 nvarchar(4000), @p6 nvarchar(4000), @p7 nvarchar(4000), @p8 nvarchar(4000), @p9 nvarchar(4000)',@p0=NULL,@p1='2015-09-28T23:03:21.5561720',@p2=NULL,@p3=NULL,@p4=N'INFO',@p5=N'Fanatics.ConsoleApp.Program',@p6=N'Console app test',@p7=N'0',@p8=NULL,@p9=NULL
go
Linux 上的失败是:
从字符串转换日期和/或时间时转换失败。
问题
- 当类型显式设置为
datetime时,为什么 Windows 会生成datetime2? - linux 版本生成无效SQL,因此失败。如何在 mono/linux 上插入
datetime值?
【问题讨论】:
-
您使用的是最新的 beta 7 吗?
标签: sql-server windows mono debian entity-framework-core