.net core 实体框架核心3.1和Oracle 12c-modelBuilder的编码问题。实体<>;。HasData

.net core 实体框架核心3.1和Oracle 12c-modelBuilder的编码问题。实体<>;。HasData,.net-core,entity-framework-core,oracle12c,ef-core-3.1,.net Core,Entity Framework Core,Oracle12c,Ef Core 3.1,在使用迁移填充数据时,我似乎对使用EF Core 3.1和Oracle 12进行编码有问题 我尝试用一些值填充数据库,我希望在迁移期间这样做 实体类如下所示: public class AlertTemplate { public int AlertTemplateId { get; set; } public short AlertTemplateVersion { get; set; } public short NumberO

在使用迁移填充数据时,我似乎对使用EF Core 3.1和Oracle 12进行编码有问题

我尝试用一些值填充数据库,我希望在迁移期间这样做

实体类如下所示:

    public class AlertTemplate
    {
        public int AlertTemplateId { get; set; }
        public short AlertTemplateVersion { get; set; }
        public short NumberOfValues { get; set; }

        [Column(TypeName = "nvarchar2(50)")]
        public string Name { get; set; }
        [Column(TypeName = "nvarchar2(200)")]
        public string ShortDescription { get; set; }
        public string Description { get; set; }
        public int StartingAlertLevel { get; set; }
    }
因此,我已将此添加到我的DBContexts OnModelCreating中:

           modelBuilder.Entity<AlertTemplate>().HasData(
                new AlertTemplate { AlertTemplateId = 0, AlertTemplateVersion = 1, Name = "Unspecified Alert Alert", StartingAlertLevel = 20, ShortDescription = "An alert was raised but there was a misconfiguration. So instead this generic alert was raised.", Description = "This generic alert was raised because something wen´t wrong while raising a specific alert. Most probably some kind of misconfiguration.\nThe following additional Information is available for the alert that should have been raised:\n\nAlertId:{0} in Version:{1}\nServer:{2}\nError/Exception:{3}", NumberOfValues = 4 },
乍一看,这可能并不明显,所以:问题在于文t。事实上,我拼错了,但让我们把重点放在上,它不应该出现在那里,而不是“')

我检查了迁移生成的.cs文件的编码。它以UTF8编码(带BOM)。 在该文件中“')仍然是“'):

当我从数据库中获取该条目时,我还获得了。 因此,使用migrationBuilder插入时似乎发生了一些情况

我还检查了生成的脚本: 使用包管理器控制台:脚本迁移 再一次。。。那里一切似乎都很好

BEGIN
INSERT INTO "AlertTemplates" ("AlertTemplateId", "AlertTemplateVersion", "Description", "Name", "NumberOfValues", "ShortDescription", "StartingAlertLevel")
VALUES (0, 1, N'This generic alert was raised because something wen´t wrong while raising a specific alert. Most probably some kind of misconfiguration.
The following additional Information is available for the alert that should have been raised:

AlertId:{0} in Version:{1}
Server:{2}
Error/Exception:{3}', N'Unspecified Alert Alert', 4, N'An alert was raised but there was a misconfiguration. So instead this generic alert was raised.', 20);
END;
我还查看了脚本,以检查是否设置了任何排序规则或编码,没有类似的设置。我还检查了值类型:所有字符串似乎都转换为nvarchar2,要么使用maxlen,要么使用我在属性中提供的长度

我使用SQL Developer直接在数据库中更新了条目,并将“?”更改为“')。之后,当读入字符串时,我实际上得到了“'),所以这个问题似乎与迁移的作用有关

我还尝试使用实体类插入条目

dbcontext.AlertTemplates.Add(new AlertTemplate [...]
dbcontext.SaveChanges() 
这确实有效,并且“')不替换为“?”。但是,我希望使用迁移来更新数据库和我的模板表

我在寻找一种设置编码和/或排序规则的方法,但我只找到了MySQL的示例,而实际上我的搜索中包含了oracle


除了我拼错了“Got”这一事实之外,还有什么可以做的呢?

这可能有助于说明mysql示例SEF没有任何魔力。不应该涉及任何编码-.NET字符串是Unicode,Windows字符串是Unicode,数据库使用Unicode字段(
nvarchar
)。奇怪的是文本-
wen't
。您的源文件是否存储为UTF8?或者它存储在您的本地代码页中<代码>?没有特殊含义,这表明您的源代码是使用一个代码页存储的,而使用另一个代码页编译的one@mcalex不会的——MySQL没有明确的Unicode类型,而Oracle(和其他主要的商业数据库)有。Oracle不需要特定的编码来存储Unicode数据。这个问题是在文本到达数据库之前造成的。我刚刚用notepad++检查了迁移文件,它存储在UTF-8中(带有BOM)。我将更新这个问题…我还尝试使用我的实体类在迁移之外添加这些条目。。。那很好用。。。因此,似乎ef core tools以某种方式生成/migrationBuilder.InsertData的迁移仅限于此
BEGIN
INSERT INTO "AlertTemplates" ("AlertTemplateId", "AlertTemplateVersion", "Description", "Name", "NumberOfValues", "ShortDescription", "StartingAlertLevel")
VALUES (0, 1, N'This generic alert was raised because something wen´t wrong while raising a specific alert. Most probably some kind of misconfiguration.
The following additional Information is available for the alert that should have been raised:

AlertId:{0} in Version:{1}
Server:{2}
Error/Exception:{3}', N'Unspecified Alert Alert', 4, N'An alert was raised but there was a misconfiguration. So instead this generic alert was raised.', 20);
END;
dbcontext.AlertTemplates.Add(new AlertTemplate [...]
dbcontext.SaveChanges()