"在一台机器上重复键入主键",但在另一台机器上没有,具有相同的数据?

Blu*_*eft 11 c# mysql entity-framework

我的问题:在我的本地机器/ MySQL数据库上插入一组数据,但在生产时会导致Duplicate entry for key 'PRIMARY'错误.据我所知,两个设置都是等价的.

我的第一个想法是它是一个整理问题,但我已经检查过两个数据库中的表都在使用utf8_bin.

该表开始为空,我.Distinct()在代码中,所以不应该有任何重复的条目.

有问题的表格:

CREATE TABLE `mytable` (
  `name` varchar(100) CHARACTER SET utf8 NOT NULL,
  `appid` int(11) NOT NULL,
  -- A few other irrelevant fields
  PRIMARY KEY (`name`,`appid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Run Code Online (Sandbox Code Playgroud)

Database.cs:

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class Database : DbContext
{
    public DbSet<MyTable> MyTable { get; set; }
    public static Database Get()
    {
        /* Not important */
    }
    //etc.
}
Run Code Online (Sandbox Code Playgroud)

MyTable.cs:

[Table("mytable")]
public class MyTable : IEquatable<MyTable>, IComparable, IComparable<MyTable>
{
    [Column("name", Order = 0), Key, Required, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string Name
    {
        get { return _name; }
        set { _name = value.Trim().ToLower(); }
    }

    private string _name;

    [Column("appid", Order = 1), Key, Required, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ApplicationId { get; set; }

    //Equals(), GetHashCode(), CompareTo(), ==() etc. all auto-generated by Resharper to use both Name and ApplicationId.
    //Have unit-tests to verify they work correctly.
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

using(Database db = Database.Get())
using(DbContextTransaction transaction = db.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
{
    IEnumerable<MyTable> newEntries = GetNewEntries();
    //Verify no existing entries already in the table; not necessary to show since table is empty anyways
    db.MyTable.AddRange(newEntries.Distinct());
}
Run Code Online (Sandbox Code Playgroud)

我不知道在.Distinct()使用代码之后,在数据库中可能存在重复条目utf8_bin,特别是因为它可以在一台机器上运行而不是在另一台机器上运行.有没有人有任何想法?

Blu*_*eft 0

我最终通过 unicode 转义非 ascii 字符来解决它,类似于此解决方案

但是,我仍然不知道为什么会发生这种情况......