2013-03-07 10 views
8

Ich habe 3 Tabellen,Entity Framework hinzugefügt Datensatz in viele zu viele Zuordnungstabelle

1) Kunde (ID, Name, bla bla)

2) CustomerGroups (GroupId, Gruppenname)

3) CustomerInGroups (CustomerId, GroupId)

using (var context = DataObjectFactory.CreateContext()) 
{     
    context.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id; 
} 

Wie füge ich einen Datensatz in CustomerInGroups? EntityFramework erzeugt keine Einheiten für so many-to-many-Zuordnungstabellen

Edit:

Sowohl die Id-Spalten in dem Kunden und CustomerGroups auf Autoinkrement eingestellt sind.

Also in meinem CustomersGroup Tisch, ich habe

Id   Name 
---------------------------- 
1   Normal 
2   VIP 

Ich habe versucht, dies zu tun, wie einem der Plakate vorgeschlagen:

entity.CustomerGroups = new List<CustomerGroup> 
{ 
    new CustomerGroup {Id = 2 } 
}; 
context.Customers.Add(entity); 
context.SaveChanges(); 
return entity.Id; 

Allerdings, wenn ich dies tat, statt der Schaffung eines Datensatzes in die Zuordnungstabelle wie folgt aus:

CustomerId   GroupId 
---------------------------- 
1     2 

Was ich bekam, war

CustomerInGroups 
    CustomerId   GroupId 
    ---------------------------- 
    1     3 

CustomerGroups 
    Id   Name 
    ---------------------------- 
    1   Normal 
    2   VIP 
    3   NULL 

Es erstellt tatsächlich einen weiteren Eintrag in meinem CustomerGroups Tabelle, die nicht das, was ich

+1

Ist Rahmen Entität nicht automatisch die Tabelle für Sie beitreten zu aktualisieren, wenn Sie einen Kunden zu einer Gruppe zuweisen oder umgekehrt? Sie müssen keine separate Entität erstellen, wenn der Join keine Nutzlast hat (dh ein Join, der _only_ Fremdschlüssel ist) – Daniel

Antwort

7

Fliegen eines kleinen Blind, da Sie, welche Eigenschaften entity hat nicht enthalten sein sollen ist. Aber Sie sollten eine Eigenschaft für die Beziehung zu CustomerGroups haben. Setzen Sie diese Eigenschaft nur auf die Gruppen, mit denen Sie in Beziehung stehen möchten. Zum Beispiel würde dies einen neuen Gruppennamen "foo bar" erzeugen und die Entität mit dieser Gruppe verknüpfen.

using (var context = DataObjectFactory.CreateContext()) 
{ 
    entity.CustomerGroups = new List<CustomerGroup> { GroupName = "Foo bar" }; 
    context.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id; 
} 

Wenn die Beziehung richtig eingerichtet ist, EF wird automatisch ein Datensatz in CustomerGroups einfügen und eine Beziehung in die CustomerInGroups Tabelle einfügen.

EDIT:

Wenn Sie eine vorhandene CustomerGroup zu einem neuen Kunden hinzuzufügen versuchen. Sie verlassen nun die CustomerGroup aus der Datenbank erhalten möchten zuerst, dann fügen Sie es dem Kunden Entität Sie Einfügen. Sie wie folgt vor

using (var context = DataObjectFactory.CreateContext()) 
{ 
    var customerGroups = context.CustomerGroups.Where(...).ToList(); // get your CustomerGroup object(s) here, and ensure it's enumerated with ToList() 
    entity.CustomerGroups = customerGroups; 
    context.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id; 
} 
+0

Dies hat bei mir nicht funktioniert. Es hat einen weiteren Datensatz in meiner Gruppen-Tabelle erstellt –

+0

@PapyrusBit Bearbeitete meine Antwort, damit eine 'CustomerGroup' bereits erstellt werden kann. Sie können sich also auf eine bereits bestehende Kundengruppe eines Kunden beziehen. –

+0

@StevenV Obwohl ich verfolgt habe, was Sie tun, wenn die zweite Entität existiert, erstellt es immer noch einen neuen Datensatz für mich :( – Ciwan

2

Wenn Sie assing einen bestehenden Kunde zu einer _existing Gruppe und unter der Annahme, versuchen, dass das CustomerGroup Objekt eine ICollection aussetzt:

(var context = DataObjectFactory.CreateContext()) 
{ 
    context.Customers.Add(entity); 
    var group = context.CustomerGroups.Find(2); // or however you retrieve the existing group 
    group.Customers.Add(entity); 
    context.SaveChanges(); 
    return entity.Id 
} 

Die Find() -Methode ist Entity Framework Code First (DbContext) Art der Suche nach Id. Ich kann nicht von der Oberseite meines Kopfes erinnert mich an die „richtige“ Object Art und Weise, es zu tun, aber doch .Single (g => g.Id == 2) würde auch funktionieren.

Im Idealfall würde Sie uns eine bessere Vorstellung davon, wie Sie Ihre Einheiten zugeordnet werden, so dass wir wissen, wie Sie Ihre Entitäten beziehen.

+0

Ich mache alle oben genannten, aber es schafft immer noch einen neuen Datensatz in der Datenbank! Obwohl ich sage es einen vorhandenen Datensatz zu verwenden und eine Beziehung zu bilden zwischen der neuen Entität und dem neuen Datensatz! – Ciwan

+0

@Ciwan hast du eine neue Frage gepostet? Es ist schwierig, nur auf Basis deines Kommentars zu antworten. Als Leitfaden solltest du sicherstellen, dass du keine bestehende Entität zurück in EF-Kontext-Sammlungen hinzufügst. – Daniel

1

Zusätzlich zur Antwort von @ Steven-v: Wenn Sie zuvor Kundengruppen abgerufen haben und sie nicht erneut aus db abrufen möchten, können Sie sie auch einfach an den Kontext anhängen.

foreach (var c in customer.CustomerGroups) 
{ 
    _db.CustomerGroups.Attach(c); 
}   
_db.Customer.Add(customer); 
_db.SaveChanges(); 
Verwandte Themen