Sql server 生成的EntityFramework SQL正在使用varchar而不是nvarchar

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

我在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
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)