मेरी समस्या: डेटा का एक सेट मेरे स्थानीय मशीन/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());
}
मुझे utf8_bin
का उपयोग करते समय कोड में .Distinct()
करने के बाद डेटाबेस में डुप्लिकेट प्रविष्टियां हो सकती हैं, खासकर जब से यह एक मशीन पर काम करती है लेकिन दूसरी नहीं। क्या किसी के पास कोई विचार है?
'Distinct' के बारे में एक संबंधित सवाल: [अलग LINQ के साथ वस्तुओं के लिए काम नहीं कर रहा] (http://stackoverflow.com/q/1365748/4519059);)। –
शायद यह कोड चलने वाली मशीनों की वर्तमान संस्कृति से संबंधित है। स्ट्रिंग समानता तुलना मौजूदा संस्कृति पर निर्भर करती है, इसलिए अलग-अलग सर्वरों पर अलग-अलग परिणाम उत्पन्न कर सकते हैं। फिर, जिन नामों को वर्तमान संस्कृति के साथ .NET द्वारा अलग माना जाता है उन्हें MySQL द्वारा समान माना जाता है और आपको उल्लंघन मिलता है। तो, दोनों मशीनों की भाषा सेटिंग्स की जांच करने का प्रयास करें, और यदि यह वास्तव में समस्या है - स्ट्रिंग तुलनाओं में समान संस्कृति का उपयोग करें। – Evk
क्या आप असामान्य मानों का उदाहरण दे सकते हैं? दोनों मशीनों से। –