Как с помощью Entity Framework отразить отношения "многие ко многим" и добавить существующие объекты в создаваемый новый объект?

Я новичок в Entity Framework и пытаюсь во всем разобраться. У меня создана не очень сложная база данных. Есть около 7 таблиц, и 3 из них являются таблицами сопоставления, чтобы связать одну запись таблицы с другой. Вот пример, который я использую:

  • Пользователь таблицы

    • UserId
    • Имя пользователя
  • Роль стола

    • RoleId
    • RoleName
  • Таблица: UserRole

    • UserId
    • RoleId

Внешние ключи отображаются в моей базе данных. Когда я создаю новую модель сущности внутри VS 2008, схема, кажется, имеет правильные отношения, но не создает таблицу для таблицы UserRole. Отношения отображаются как отношения «многие ко многим» между пользователем и ролью.

Моя проблема в том, что я могу создавать новых пользователей и новые роли, но я не могу понять, как создать нового пользователя с существующей ролью. Более того, таблица UserRole, вероятно, изначально неправильно отображается в модели. Вот мой код:

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();

Вот ошибка, которую я получаю:

Невозможно обновить EntitySet «UserRoles», потому что у него есть DefiningQuery, а в элементе нет элемента, поддерживающего текущую операцию.

Вот xml, относящийся к таблице 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>

Он тянул зубы только для того, чтобы выяснить, как запросить контекст, чтобы получить реальную сущность «Роль». Я уверен, что проблема как-то связана с тем, как отображается UserRole, но я только начинаю здесь и понятия не имею, где это могло пойти не так.

И я действительно искал в Google и на этом сайте, но, полагаю, я не придумал правильных параметров поиска, чтобы найти вопрос, который поможет мне это исправить. Я нашел один вопрос, в котором говорилось, что у EF есть проблемы с этим, но если вы сопоставляете таблицу, которая делает оба столбца первичным ключом, это работает само собой. Я не знаю, как это сделать. Это делается в базе данных (с помощью SQL SERVER 2005 EXPRESS) или в сопоставлении? Это личный проект, поэтому при необходимости я могу опубликовать более подробную информацию о коде или xml. Любая помощь будет оценена по достоинству.


person jason    schedule 24.01.2010    source источник


Ответы (1)


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

Оба столбца можно сделать первичным ключом в конструкторе таблиц SQL Server Management Studio. Просто выделите одновременно User_Id и Role_Id, щелкните правой кнопкой мыши слева и выберите Primary Key ... это сделает так, что ни одна запись не может иметь одинаковую комбинацию User_Id и Role_Id ... делая каждую запись уникальной.

Затем вы можете обновить свою модель данных в конструкторе Entity Framework ... и, надеюсь, все будет хорошо.

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

person markt    schedule 24.01.2010
comment
Вот и все! Я просто не знал, как назначить 2 первичных ключа. Выделение обеих строк сработало. Спасибо! - person jason; 25.01.2010
comment
Нет проблем - рад, что смог помочь. - person markt; 25.01.2010