Sql server 生成的EntityFramework SQL正在使用varchar而不是nvarchar
我在Entity Framework(6.4.4-首先是数据库)中遇到了一个问题,生成的SQL试图使用varchar(max)而不是nvarchar(max) 背景。 我的数据库中有一个表,表上有一个varchar(max)列。此表的排序规则为Sql server 生成的EntityFramework SQL正在使用varchar而不是nvarchar,sql-server,vb.net,entity-framework,unicode,collation,Sql Server,Vb.net,Entity Framework,Unicode,Collation,我在Entity Framework(6.4.4-首先是数据库)中遇到了一个问题,生成的SQL试图使用varchar(max)而不是nvarchar(max) 背景。 我的数据库中有一个表,表上有一个varchar(max)列。此表的排序规则为SQL\u Latin1\u General\u CP1\u CI\u AS。 我被要求能够在本专栏中存储非unicode字符和文本(波斯语、阿拉伯语、波斯语等)。因此,我运行了以下SQL: ALTER TABLE LetterTemplates ALTE
SQL\u Latin1\u General\u CP1\u CI\u AS
。
我被要求能够在本专栏中存储非unicode字符和文本(波斯语、阿拉伯语、波斯语等)。因此,我运行了以下SQL:
ALTER TABLE LetterTemplates
ALTER COLUMN [Template] NVARCHAR(MAX) COLLATE SQL_Latin1_General_CP1256_CI_AS NULL
以下SQL正确运行,并将字符正确存储在数据库中
UPDATE LetterTemplates
SET [Template] = N'سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.'
WHERE TemplateID = 2259
在我的应用程序中,我更新了我的EDMX,删除并重新添加了实体,因此实体中的列属性显示为:
Fixed Length : false
Max Length : MAX
Unicode : True
Type : String
Name : Template
EDMX XML(存储模型)中的EntityType为:
edmx生成的类为:
Partial Public Class LetterTemplates
Public Property TemplateID As Integer
Public Property Title As String
Public Property Description As String
Public Property Template As String
End Class
我的代码中的行(保存到数据库)如下:
按实体框架生成的SQL显示为:
UPDATE [dbo].[LetterTemplates]
SET [Template] = @0
WHERE ([TemplateID] = @1)
-- @0: 'سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.'
(Type = AnsiString, Size = -1)
-- @1: '2259' (Type = Int32)
但是:
SQL事件探查器显示实际针对db运行的SQL(SQL Server Express 2016)
如果我将varchar(max)
更改为nvarchar(max)
并将@0=”?
更改为@0=N'.\N'.\N'.\N'.\N'.
并运行该SQL,它将正确运行
问题:
为什么SQL探查器显示列是varchar而不是nvarchar。我错过了什么明显的东西吗?我从另一个角度看到了很多问题(nvarchar填充varchar),但不是这样
更新:
在评论之后,下面这一行似乎是问题所在
(Type = AnsiString, Size = -1)
在生成的SQL中,我相信AnsiString用于非unicode字符。那么,当模型/实体和数据库现在都是nvarchar列时,为什么它在生成SQL时要这样做呢?您没有发布实体和DbContext配置,因此无法回答。Latin1可以在配置中明确指定。使用拉丁1排序规则而不是阿拉伯语来存储阿拉伯语文本肯定是不寻常的。为什么不把阿拉伯语作为?也许这是在配置中硬编码的,但您似乎错过了一些东西
Debug.WriteLine()
应该报告Type=String
,而不是Type=AnsiString
。潜伏[Column]
属性?@AlwaysLearning为实体/属性生成的类只是作为字符串的公共属性模板
-没有附加到属性的属性。@PanagiotisKanavos没有在EDMX中显式设置排序规则。背景是基本的。我在该列中使用了CP1256排序规则,因为此代码页支持(实际上)存储了我需要的字符。在EDMX中。
这意味着您使用了旧的EF版本,因为EDMX在几年前由于首先引入了代码而被废弃。您使用的是哪个版本?很可能是奇怪的排序规则导致它使用varchar
——排序规则说的是将此列视为存储CP1256文本的ASCII。您是否尝试过使用阿拉伯语作为
?
Partial Public Class LetterTemplates
Public Property TemplateID As Integer
Public Property Title As String
Public Property Description As String
Public Property Template As String
End Class
db.Database.Log = Sub(x) Debug.WriteLine(x)
UPDATE [dbo].[LetterTemplates]
SET [Template] = @0
WHERE ([TemplateID] = @1)
-- @0: 'سوالات پیوسته اهل دنیای موجود طراحی اساسا مورد استفاده قرار گیرد.'
(Type = AnsiString, Size = -1)
-- @1: '2259' (Type = Int32)
exec sp_executesql N'UPDATE [dbo].[LetterTemplates]
SET [Template] = @0
WHERE ([TemplateID] = @1)
',N'@0 varchar(max) ,@1 int',@0='???? ?????? ??? ?????? ?? ????? ????? ??????? ?? ???? ???.',@1=2259
(Type = AnsiString, Size = -1)