2013-08-07 1 views
1

J'essaie d'insérer des données en vrac, base de données est la connexion MySQL est faite en utilisant Devart LinqConnect. Voici un code:C# Linq "Entité avec la même clé '0' déjà ajoutée." lors de l'insertion de plusieurs lignes

DataContext db = new DataContext(); 
List<XYData> XYDList = new List<XYData>(); // Data Type 
List<xydata> xyToBeInsrted = new List<xydata>(); // Database table 

XYDList = XYData.genXYData(12, 1234); // Generates 12 example records 

foreach (XYData oneXY in XYDList) 
{ 
    // Create clear row representation    
    xydata xy_row = new xydata(); 
    // Assign data from object 
    xy_row.id = oneXY.Id; 
    xy_row.Batchid = (int)oneXY.BatchId; 
    xy_row.Ch = oneXY.Channel; 
    xy_row.Value = oneXY.Value; 
    xy_row.Pos = (int)oneXY.Position; 
    xy_row.Dtm = oneXY.Time; 

    // Add to list of rows to be inserted 
    xyToBeInsrted.Add(xy_row); 

} 
db.xydatas.InsertAllOnSubmit<xydata>(xyToBeInsrted); 
db.SubmitChanges(); 

La dernière ligne donne une erreur « entité avec la même clé « 0 » déjà ajouté. » Lorsque j'abaisse le nombre d'éléments à générer à 1 alors cela fonctionne. Tout ce qui est au-dessus de 1 donne une erreur.

Le tableau a défini l'incrément automatique sur le champ Identifiant d'enregistrement.

Essayer de résoudre cela pendant 2 heures sans succès.

EDIT: données Classe:

public class XYData 
{ 
    [Column(IsPrimaryKey = true, IsDbGenerated = true)] 
    public int Id { get; set; } 

    public int BatchId { get; set; } 
    public int Channel { get; set; } 
    public String Value { get; set; } 
    public double Position { get; set; } 
    public DateTime Time { get; set; } 

    private static Random rand = new Random(); 

    public XYData(int channel = 0, string val = "") 
    { 
     Channel = channel; 
     Value = val; 
     Position = 0; 
     Time = DateTime.Now; 
    } 

    public static List<XYData> genXYData(int howMany, int batchId) 
    { 
     List<XYData> _allXYData = new List<XYData>(); 
     for (int i = 0; i < howMany; i++) 
     { 
      XYData _singleXY = new XYData(); 
      _singleXY.BatchId = batchId; 
      for (int j = 64 * (1 << i); j > 0; j--) 
      { 
       uint k = (uint)rand.Next(int.MaxValue); 
       _singleXY.Value += k.ToString("X8"); 
      } 
      _allXYData.Add(_singleXY); // Add to list 
     } 
     return _allXYData; // Return list of generated data. 
    } 
} 
+0

On dirait que vous essayez d'entrer des données avec le même valeur dans la clé primaire, qui doit être unique. Quelle est la valeur de votre clé primaire? Si c'est BatchID, BatchID devrait être un Guid, pas un int, pour assurer l'unicité de la valeur. Vous pouvez également publier le contenu de genXYData, car il y a probablement un problème avec les valeurs d'échantillon que vous écrivez. – IllusiveBrian

+0

La clé primaire dans la base de données est Id, BatchID est une clé étrangère à l'autre table. N'a pas créé une telle variable même si je suppose qu'il est créé automatiquement ou ai-je tort? – PawelW

+0

Pouvez-vous montrer la définition de XYData s'il vous plaît. – evilbhonda

Répondre

1

Quelque chose comme cela peut être nécessaire sur votre définition du modèle -

[Column(IsPrimaryKey=true, IsDbGenerated=true)] 
public int Id { get; set; } 

http://www.devart.com/linqconnect/docs/PrimaryKeyMapping.html

+0

Modifié pour: 'public class XYData { [Colonne (IsPrimaryKey = vrai, IsDbGenerated = true)] public int Id {get; ensemble; } ' et ' xydata xy_row = new xydata(); ** xy_row.id = oneXY.Id; ** xy_row.Batchid = (int) oneXY.BatchId; 'mais toujours la même chose. – PawelW

+0

Vous ne devriez pas avoir besoin de définir la valeur Id, s'il s'agit d'une nouvelle ligne. La base de données devrait générer cela pour vous, si vous avez sélectionné Identité – evilbhonda

+0

Même si je commente 'xy_row.id = oneXY.Id;' c'est la même chose. Ça devrait marcher mais ça ne l'est pas. – PawelW

Questions connexes