0

Ich verwende Entity Framework als ORM in meinem Projekt. Nehmen wir an, ich benutze Code-First-Muster und ich habe zwei Modelle. WieEntity Framework und Duplikate

internal class First 
{   
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

internal class Second 
{   
    public int Id { get; set; } 

    public First ForeignKeyEntity { get; set; } 

    // other members 
} 

Und hier Code Datenbank bevölkern:

List<Second> res = GetData(); 
using (var ctx = new StatisticContext()) 
{ 
    foreach (var item in res) 
    { 
     ctx.Seconds.Add(item); 
    } 
    ctx.SaveChanges(); 
} 

Wie Sie jede Instanz der Klasse sehen First in ihrem Mitglied ForeignKeyEntitySecond Instanz der Klasse hat. Offensichtlich können einige Instanzen von First in res dupliziert werden. Und wenn ich diesen Code ausführen ich DbUpdateException in ctx.SaveChanges() mit innerer Ausnahme erhalten, dass die folgenden Meldung hat:

Violation of PRIMARY KEY constraint 'PK_dbo.First'. 
Cannot insert duplicate key in object 'dbo.First'. 
The duplicate key value is (29459). The statement has been terminated. 

Ich kann nicht duplizierten Zeilen einfügen, aber ich will nicht Duplikate einzufügen, würde Ich mag Zeile einfügen nur wenn es nicht existiert. Wie man dieses Problem löst? Wie fügt man ein Fremdschlüsselobjekt nur ein, wenn es nicht existiert?

+0

Was ist die Beziehung 'First: Second'? – Sampath

+0

@Sampath Jede Instanz von Second hat eine Instanz von First. Als Datenbank habe ich zwei Tabellen: Erste und Zweite. Und Second hat einen Fremdschlüssel für die ID in der Tabelle Erste – Pupkin

+0

ist das bedeuten '1: 1'? – Sampath

Antwort

1

Die normale Art, Dinge zu tun, wäre, zuerst mit dem Element zu lesen, um zu sehen, ob es existiert. Wenn dies der Fall ist, müssen Sie ctx.Seconds.Update(item);

verwenden. Wenn sich Ihre Artikel bereits im Kontext befinden, können Sie den Status überprüfen. es wird entweder State.Modified oder State.Added sein.

Was ist in GetData()