2013-03-07 16 views
8

mam 3 tabele,Entity Framework dodanie rekordu w wiele do wielu tabeli mapowania

1) klienta (id, nazwisko, bla bla)

2) customergroups (GroupID, GroupName)

3) CustomerInGroups (CustomerId, GroupId)

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

Jak dodać rekord do CustomerInGroups? EntityFramework nie generuje takich jednostek do wielu-do-wielu tabel mapowania

Edit:

Obie kolumny identyfikator klienta i customergroups są ustawione na auto przyrostu.

Więc w moim stole CustomersGroup mam

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

Próbowałem robić to jako jeden z plakatów zasugerował:

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

Jednak, kiedy to zrobił, zamiast tworzyć rekord w tabela mapowania tak:

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

dostałem

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

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

To faktycznie utworzony kolejny wpis w moim stole customergroups, co nie jest to, co chcę

+1

Czy struktura encji nie aktualizuje automatycznie tabeli łączenia podczas przypisywania klienta do grupy lub odwrotnie? Nie musisz tworzyć oddzielnej encji, jeśli join nie ma ładunku (tj. Join, czyli _własne_ klucze obce). – Daniel

Odpowiedz

7

Latanie trochę ślepy ponieważ nie zawierała jakie właściwości entity ma. Ale powinieneś mieć właściwość do związku z CustomerGroups. Po prostu ustaw tę właściwość z grupami, które chcesz powiązać. Na przykład może to stworzyć nową nazwę grupy "pasek foo" i powiązać encję z tą grupą.

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

Jeżeli związek jest ustawiony prawidłowo, EF automatycznie wstawić rekord w CustomerGroups i wstawić relacji do tabeli CustomerInGroups.

EDIT:

Jeśli próbujesz dodać istniejący CustomerGroup do nowego klienta. Najpierw należy pobrać CustomerGroup z bazy danych, a następnie dodać ją do wstawianego elementu Customer.

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

To nie działało dla mnie. Stworzył kolejny rekord w moich grupach stół –

+0

@PapyrusBit Pod moją odpowiedź, aby umożliwić dla 'CustomerGroup' być już utworzony. Możesz więc odnosić się do już istniejącej "Grupy klientów" od klienta. –

+0

@StevenV Mimo że następuje to, co robisz, gdy istnieje 2. Podmiot, jest nadal tworzenia nowego rekordu dla mnie :( – Ciwan

2

Jeśli próbujesz assing się istniejącą klienta do grupy _existing i przy założeniu, że obiekt CustomerGroup naraża kolekcji ICollection, wykonaj następujące czynności:

(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 
} 

Find() metoda

jest Entity Framework Code First (DbContext) sposób wyszukiwania według Id. Nie pamiętam z góry mojej głowy "właściwego" sposobu ObjectContext, ale również .Single (g => g.Id == 2) również działałoby.

Najlepiej byłoby, gdybyśmy mieli lepsze wyobrażenie o tym, w jaki sposób twoje obiekty są mapowane, abyśmy wiedzieli, w jaki sposób relacjonujesz swoje jednostki.

+0

robię wszystko powyższe, ale wciąż jest utworzenie nowego rekordu w bazie danych! Nawet jeśli mówię go użyć istniejącego rekordu i tworzą związek pomiędzy nowym podmiotem i nowym rekordem! – Ciwan

+0

@Ciwan skończyłeś pisać nowe pytanie? trudno odpowiedzieć tylko na podstawie Twojego komentarza. Jako przewodnik upewnij się, że nie dodają żadnej istniejącej jednostki z powrotem do żadnej kolekcji kontekstowych EF. – Daniel

1

oprócz odpowiedzi @ Stevena-V, o ile wcześniej sprowadzone grupy klientów i nie chcesz, aby pobrać je ponownie z db, można również po prostu podłącz je do kontekstu.

foreach (var c in customer.CustomerGroups) 
{ 
    _db.CustomerGroups.Attach(c); 
}   
_db.Customer.Add(customer); 
_db.SaveChanges(); 
Powiązane problemy