Моя проблема: вставка набора данных работает в моей локальной машине/базе данных 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;
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.
}
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.
}
Затем, используя его:
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());
}
Я не понимаю, как могут быть дублированные записи в базе данных после выполнения .Distinct()
в коде при использовании utf8_bin
, тем более, что он работает на одной машине, но не в другой. У кого-нибудь есть идеи?