Проблема отображения нескольких отношений с использованием Entity Framework кода в первую очередь - PullRequest
4 голосов
/ 02 июня 2011

Сценарий

У меня есть модель со следующими настройками:

Участник может быть членом нескольких списков участников. Список участников может иметь несколько участников. Я также определил, что список участников может иметь отдельный набор дополнительных членов. По сути, у меня двойные отношения между членом и участником. Более того, список участников всегда принадлежит одному участнику, который создал список участников.

Задача

Платформа Entity Framework Code First не может правильно отобразить эти отношения, даже если я расскажу им, как отобразить отношения. Я получаю следующую ошибку при попытке использовать DbContext в первый раз

Schema specified is not valid. Errors: 
(32,6) : error 0040: Type MemberList_Members is not defined in namespace NerdCooking.Models (Alias=Self).
(33,6) : error 0040: Type MemberList_OptionalMembers is not defined in namespace NerdCooking.Models (Alias=Self).

Что я пробовал

Первая попытка использовать модель в сценарии не удалась, потому что ясно, что EF не знает, как отобразить отношения n-m. Так что я подробно рассказал фреймворку, как исправить ситуацию.

// Map the relation between members of a memberlist and the memberlist
// to a Membership table
modelBuilder.Entity<MemberList>().HasMany(memberList => memberList.Members)
    .WithMany(member => member.MemberLists)
    .Map(mapping => mapping.MapLeftKey("MemberId")
        .MapRightKey("MemberListId").ToTable("Membership"));

// Map the relation between optional members of a memberlist and the memberlist
// to a separate table
modelBuilder.Entity<MemberList>().HasMany(memberList => memberList.OptionalMembers)
    .WithMany(member => member.MemberLists)
    .Map(mapping => mapping.MapLeftKey("MemberId")
        .MapRightKey("MemberListId").ToTable("OptionalMembership"));

// Map the relationship between the owner and the memberlist
modelBuilder.Entity<MemberList>().HasRequired(memberList => memberList.Owner)
    .WithMany(member => member.MemberLists).WillCascadeOnDelete(true);

Мой вопрос

Возможен ли этот сценарий с помощью Entity Framework 4.1 с первым кодом? И если да, то как лучше всего решить проблему с отображением, с которой я столкнулся?

Я всегда могу изменить модель, чтобы она содержала сущность Членство, которая связывает члена с списком участников. Это делает все это немного более явным, и я могу добавить свойство к этому объекту, чтобы пометить его как необязательное.

Я думаю, однако, что это сценарий, который должен был сработать, поэтому я надеюсь, что кто-то делал это раньше и знает, в чем заключается хитрость, чтобы заставить его работать правильно.

1 Ответ

9 голосов
/ 02 июня 2011

Все ваши отображения содержат .WithMany(member => member.MemberLists). Это неверно. Вам нужно отдельное свойство навигации для каждого отношения = вы можете использовать каждое свойство навигации только для одного отображения отношений.

...