2016-11-17 4 views
0

Ok lassen Sie mich mit meinem Modell starten:Entity Framework-Code Erster Satzfehler

Kontakt-Methode Arten:

public class ContactMethodType 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    public Guid ContactMethodTypeGUID { get; set; } 

    [Required(ErrorMessage = "Please enter a Contact Method Type Name.")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Please enter a brief description.")] 
    public string Description { get; set; } 

    public bool IsActive { get; set; } 

    public virtual ICollection<ContactMethod> ContactMethods { get; set; } 

Kontakt Methoden:

public class ContactMethod 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    public Guid ContactMethodGUID { get; set; } 

    public virtual ContactMethodType Type { get; set; } 

    public string CountryCode { get; set; } 

    [Required] 
    public string Identifier { get; set; } 

    public bool IsPreferred { get; set; } 

} 

Empfänger:

public class Recipient 
{ 
    [Key] 
    public Guid RecipientGUID { get; set; } 

    [Required(ErrorMessage = "Please enter a Recipient's First Name.")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Please enter a Recipient's Last Name.")] 
    public string LastName { get; set; } 

    public string Company { get; set; } 

    public UserGroup Owner { get; set; } 

    public List<ContactMethod> ContactMethods { get; set; } 

    public User CreatedBy { get; set; } 

    public DateTime CreatedOn { get; set; } 

    public User LastModifiedBy { get; set; } 

    public DateTime LastModifiedOn { get; set; } 

    public bool IsActive { get; set; } 

} 

Ich habe zwei Con Takt-Methode Typen bereits definiert: E-Mail und SMS

Jetzt bin ich einen neuen Empfänger zu schaffen, so dass ich hinzufügen, alle erforderlichen Daten zu meinem Empfänger Objekt, und dann rufe ich:

context.Recipients.Add(myRecipient); 
context.SaveChanges(); 

Was ich ist ein Fehler, den ich bin, um einen neuen ContactMethodType hinzuzufügen, wenn einer bereits vorhanden ist. Aber das soll eine Eins-zu-Viele-Beziehung sein, und ich möchte keinen neuen ContactMethodType hinzufügen, sondern einfach eine neue Kontaktmethode (n) für meinen Empfänger kategorisieren.

Ich bin nicht sicher, wann dies geschieht. Vielleicht ist mein Modell falsch? Basierend auf dem, was als Typ ausgewählt ist, ziehe ich dieses Type-Objekt und setze es auf die Variable ContactMethod.Type. Aber wie ich schon sagte, anstatt es nur mit einem vorhandenen ContactMethodType zu verknüpfen, versucht es es neu zu erstellen, und da die GUID bereits existiert, bekomme ich den Fehler, dass der Datensatz nicht erstellt werden kann, da der Schlüssel (GUID) bereits existiert.

Irgendwelche Ideen?

+0

Wie bevölkern Sie 'myRecipient.ContactMethods'? Kannst du diesen Code posten? – wdosanjos

+0

ich eine Kontaktmethode Objekt zu erstellen, füllen Sie es, dann: tmpRecipient.ContactMethods.Add (myCM); – MarekT

+0

Erhalten Sie die Objekte für Ihre Kontaktmethodenliste aus einer Abfrage? Oder instanziieren Sie sie als 'neue ContactMethod'? Letzteres wird die von Ihnen gemeldete Ausnahme verursachen. – wdosanjos

Antwort

0

Nach diesem offline mit Marek diskutieren, kochte es, dass alle Einheiten neu hinzugefügt werden, sind in der Grafik DbSet<TEntity>.Add(entity) unter der Annahme, nach unten.

Von The API docs for Add ...

Beginnt die gegebene Einheit Tracking und alle anderen erreichbaren Einheiten, die nicht bereits verfolgt werden, in der am Zustand, so dass sie in die Datenbank eingefügt werden, wenn Savechanges() wird genannt.

Da dieses Modell Client generierten Schlüssel verwendet bedeutet, dass alle Unternehmen ein Schlüsselwert zugewiesen haben, bevor sie in den Kontext gegeben sind, können Sie keine der „smarter“ Methoden (wie DbSet<TEntity>.Attach(entity)) das würde Inspect Schlüsselwerte zu erarbeiten, wenn jede Entität neu oder vorhanden ist.

Nach dem neuen Empfänger hinzufügen, können Sie Anruf DbSet<TEntity>.Attach(entity) auf jeder bestehende Einheit (das heißt die Methode Kontakt-Typ) verwenden. Alternativ teilt EF auch mit, dass eine Entität bereits in der Datenbank vorhanden ist.

Sie könnten auch auf DbContext.ChangeTracker.TrackGraph(...), finden Sie unter API docs für weitere Informationen.