首页 > 解决方案 > 通过实体框架将特殊字符(ą、ź 等)插入 varchar 列

问题描述

我正在尝试使用 Entity Framework 6一些带有特殊字符的字符串插入到我的数据库中,但似乎 EF 在放入 DB 时会更改它们。例如,“zażółć gęślą jaźń”变为“zazólc gesla jazn”。

我想插入我的数据不变并将我的列保持为 varchar。

我已经尝试了一些注释和执行命令,这些命令在创建数据库后改变了排序规则和字符集,但是这些尝试都失败了。

using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
using MySql.Data.EntityFrameworkCore.DataAnnotations;

class Program
{
    static void Main(string[] args)
    {
        using (var context = new TestDBContext())
        {
            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();
            // tried this
            context.Database.ExecuteSqlCommand(
                "ALTER DATABASE `TestDB` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci");
            context.insertData();
            // result: "lódz" - doesn't work either
            context.Database.ExecuteSqlCommand(
                "INSERT INTO `testtable` (`Id`, `SpecialCharacters`) VALUES (NULL, 'łódź')");
        }
    }
}

class TestDBContext : DbContext
{
    public Microsoft.EntityFrameworkCore.DbSet<TestTable> TestTable { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseMySQL("server=localhost;database=TestDB;user=root;password=;SslMode=None;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<TestTable>()
            .HasKey(t => t.Id);
    }

    // result: "zazólc gesla jazn" instead of "zażółć gęślą jaźń"
    public void insertData()
    {
        using (var context = new TestDBContext())
        {
            context.TestTable.Add(new TestTable
                {
                    SpecialCharacters = "zażółć gęślą jaźń",
                }
            );
            context.SaveChanges();
        }
    }
}

class TestTable
{
    public int Id { get; set; }

    [Column(TypeName = "varchar(17)")]
    [MySqlCharset("utf8")] // tried this
    [MySqlCollation("utf8_unicode_ci")] // tried this
    public string SpecialCharacters { get; set; }
}

(注意context.Database.ExecuteSqlCommand("INSERT INTO...也违反了数据。通过控制台(没有 EF)添加这样的数据就可以了。)

最后,我的问题:如何使用实体框架将带有特殊字符的字符串插入 DB 中的 varchar 列?

标签: c#mysqlentity-framework

解决方案


推荐阅读