2016-11-14 21 views
0

Ich habe den folgenden Code in C#:Ungewöhnliches Verhalten von Entity Framework

public int AddSynonymBL(String[] syns, String word, User user) 
{ 
    int dismissedCounter = 0; 
    foreach (var item in syns) 
    { 
     BusinessLayerStatus.StatusBL res = this.dataAccess.AddSynonymDA(item.Trim().ToLowerInvariant(), word.Trim().ToLowerInvariant(), user); 
     if (res == BusinessLayerStatus.StatusBL.SynonymNotAdded) 
      ++dismissedCounter; 
    } 
    int numberOfFailures = dismissedCounter; 
    return numberOfFailures; 
} 

Und der folgenden Code ist für AddSynonymDA Methode:

internal BusinessLayerStatus.StatusBL AddSynonymDA(string synonym, string word, User user) 
{ 
    try 
    { 
     Synonym newSyn = new Synonym() 
     { 
      Meaning = synonym 
     }; 
     //The following if means that the searched word does not exist int the Searched table 
     if (this.context.Users.Where(a => a.Mail.Equals(user.Mail)).FirstOrDefault().Searcheds.Where(b => b.RealWord.Equals(word)).Count() == validNumberForKeyValues) 
     { 
      this.context.Users.Where(a => a.Mail.Equals(user.Mail)).FirstOrDefault().Searcheds.Where(b => b.RealWord.Equals(word)).FirstOrDefault().Synonyms.Add(newSyn); 
      this.context.SaveChanges(); 
      return BusinessLayerStatus.StatusBL.SynonymAdded; 
     } 
     else 
      return BusinessLayerStatus.StatusBL.SynonymNotAdded; 
    } 
    catch (Exception ex) 
    { 
     ExceptionAction(ex); 
     return BusinessLayerStatus.StatusBL.SynonymNotAdded; 
    } 
} 

ich Entity Framework verwenden. Ich habe eine Tabelle, die eine ID, eine Wortspalte enthält. Beide haben zusammen eine eindeutige Schlüsseleinschränkung in der Datenbank. Mein main Code ist wie folgt:

public static void Main() 
{ 
    EngineEntities context = new EngineEntities(); 
    BusinessLogic bl = new BusinessLogic(); 
    String[] s = new String[] { "java", "DB" }; 
    Console.WriteLine(bl.AddSynonymBL(s, "Java", new User() { Mail = "media" })); 
} 

Wenn ich hinzufügen, einen Wert, der in der Tabelle alles existiert nicht in Ordnung ist, aber wenn ich hinzufügen, einen Wert, der bereits in der Tabelle vorhanden ist, this.context.SaveChanges(); im AddSynonymDA Methode aufrufen, immer löst eine Ausnahme aus, die für die vorherige erste Ausnahme galt, die die erste Ausnahme verursachte, und der Datenbank wird nichts hinzugefügt, auch wenn sie nicht in der Datenbank vorhanden sind. Warum das?

Ich bekomme den folgenden Fehler, der zeigt, dass Java bereits existiert. Das Problem ist, dass Java für den ersten Anruf ist, als zweiten Anruf habe ich DB nicht Java übergeben.

{ "Verletzung der UNIQUE KEY Einschränkung 'IX_Searched'. Doppelte Schlüssel in Objekt einfügen 'dbo.Searched'. Der doppelte Schlüsselwert (Java, 2). \ R \ nDie Anweisung wurde beendet." }

+1

Haben Sie versucht, nach dem ersten Einfügen einen neuen Kontext zu erstellen? – hofmeister

+1

@hofmeister nein, wie ich in 'Main' Methode erwähnt habe, habe ich nur einen Kontext und benutze das immer. Ist das falsch? – Media

+0

Was ist diese Methode 'AddNewWordToSearchedBL'? –

Antwort

1

ich vermute, dass Sie nicht eine Spalte zu einer Identitätsspalte in Ihrer Datenbank

mit anderen Worten festgelegt haben, wenn Sie ein Objekt, das Sie eine Spalte benötigen einfügen automatisch zu inkrementieren. Die Art, wie ich dies tun, ist zum Beispiel die Verwendung von SQL Server:

ALTER TABLE [User] DROP COLUMN [ID]; 

ALTER TABLE [User] 
    ADD [ID] integer identity not null; 

Wenn Sie nicht bereits eine ID-Spalte haben Sie die erste Zeile nicht brauchen. Aktualisieren Sie anschließend Ihr EF-Modell in Ihrem Projekt, indem Sie die Benutzertabelle löschen und mit der rechten Maustaste klicken und Modell aus Datenbank aktualisieren, und wählen Sie die Tabelle aus.

Wenn Sie jetzt neue Einträge in Ihr EF-Modell einfügen, wird die ID-Spalte automatisch inkrementiert und Sie erhalten keinen Fehler.

+0

Ich habe das getan – Media

1

Sie müssen zunächst überprüfen, ob das Element vorhanden ist oder nicht, da Sie eine eindeutige Einschränkung zu haben scheinen, sollten Sie die Attribute der Referenz in Ihrem Code verwenden.

+1

ja das ist was ich meinte. –

Verwandte Themen