2010-01-24 5 views
5

Jestem nowy w Entity Framework i próbuję to rozgryźć. Mam utworzoną bazę danych, która nie jest zbyt skomplikowana. Istnieje około 7 tabel, a 3 z nich to tablice odwzorowań, które wiążą jeden rekord tabeli z innym. Przykład używam tutaj jest taka:Za pomocą Entity Framework, jak odzwierciedlić wiele do wielu relacji i dodać obiekty, które istnieją do tworzonej nowej jednostki?

  • Tabela użytkownika

    • UserId
    • nazwa_użytkownika
  • Tabela Rola

    • RoleId
    • RoleName
  • Tabela: UserRole

    • UserId
    • RoleId

The kluczy obcych są odwzorowywane w mojej bazy danych. Kiedy tworzę nowy model jednostki wewnątrz VS 2008, diagram wydaje się mieć poprawne relacje, ale nie tworzy tabeli dla tabeli UserRole. Relacja jest odwzorowywana jako rola wielu do wielu między użytkownikami.

Moim problemem jest to, że mogę tworzyć nowych użytkowników i mogę tworzyć nowe role, ale nie mogę wymyślić, jak utworzyć nowego użytkownika z istniejącą rolą. Co więcej, tabela UserRole prawdopodobnie nie została prawidłowo odwzorowana w modelu. Oto mój kod do tej pory:

ObjectQuery<Role> roles = context.Roles; 
Role role = context.Roles.Where(c => c.RoleName == "Subscriber").First(); 

User user = new User 
{ 
    DisplayName = "TestCreate2", 
    Email = "[email protected]", 
    Password = "test" 
};    
context.AttachTo("Roles", role); 
user.Roles.Add(role);    
context.AddToUsers(user); 
context.SaveChanges(); 

tu jest błąd otrzymuję:

Nie można zaktualizować „UserRoles” The EntitySet ponieważ ma DefiningQuery i żaden element nie istnieje w elemencie wspierania prąd operacja.

Oto XML, który odnosi się do stołu UserRole:

<EntitySet Name="UserRoles" EntityType="RememberTheJourneyModel.Store.UserRoles" store:Type="Tables" store:Schema="dbo" store:Name="UserRoles"> 
     <DefiningQuery>SELECT 
    [UserRoles].[Role_id] AS [Role_id], 
    [UserRoles].[User_id] AS [User_id] 
    FROM [dbo].[UserRoles] AS [UserRoles]</DefiningQuery> 
     </EntitySet> 

Został wyrywanie zębów po prostu dowiedzieć się, w jaki sposób do kwerendy kontekst taki, że dał mi rzeczywisty podmiot rolę. Jestem pewien, że problem jest związany z mapowaniem UserRole, ale dopiero zaczynam i nie mam pojęcia, gdzie to mogło pójść nie tak.

Naprawdę wyszukałem tę stronę w serwisie google &, ale przypuszczam, że nie znalazłem odpowiednich parametrów wyszukiwania, aby znaleźć pytanie, które pomoże mi to naprawić. Znalazłem jedno pytanie, które mówi, że EF ma z tym problemy, ale jeśli odwzorowujesz tabelę, czyniąc obie kolumny kluczem podstawowym, działa ona sama. Nie jestem pewien, jak to zrobić. Czy odbywa się to w bazie danych (przy użyciu SQL SERVER 2005 EXPRESS) lub w mapowaniu? Jest to projekt osobisty, więc w razie potrzeby mogę opublikować więcej szczegółów na temat kodu lub xml. Każda pomoc zostanie doceniona.

Odpowiedz

4

Pamiętam, że wpadłem na ten problem wcześniej ... i uważam, że naprawiłem to, tworząc oba klucze kolumn w mojej tabeli powiązań.

Można uczynić obie kolumny kluczem podstawowym w projektancie tabel SQL Server Management Studio. Po prostu zaznacz jednocześnie User_Id i Role_Id, kliknij prawym przyciskiem myszy po lewej i wybierz Primary Key ... spowoduje to, że żaden rekord nie będzie miał takiej samej kombinacji User_Id i Role_Id .. co spowoduje, że każdy wpis będzie unikalny.

Następnie można zaktualizować model danych w projektancie Entity Framework .. i miejmy nadzieję, że będzie dobrze, aby przejść.

Uważam, że jeśli tabela nie ma żadnych kluczy zdefiniowanych w celu zapewnienia, że ​​zapisy są unikatowe, wówczas EF nie będzie w stanie poprawnie aktualizować zapisów, a zatem ramka chroni przed tą przypadkiem.

+2

To było to! Po prostu nie wiedziałem, jak przypisać 2 podstawowe klucze. Podświetlanie obu wierszy zadziałało. Dzięki! – jason

+0

Bez problemu - cieszę się, że mogłem pomóc. – markt

Powiązane problemy