структура сущностей многие ко многим добавляют / удаляют объектные проблемы - PullRequest
3 голосов
/ 22 декабря 2010

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

 Tables:

Person (personid, name)

Personlocation (personid, locationid)

Location (locationid, description)

Personrole (personid, roleid)

Role (roleid, description)

EF предоставит мне лиц, роли и объекты местоположения.

Поскольку EF НЕ будет генерировать типы сущностей personlocation и personrole, их нельзя использовать в запросе.

ВОПРОС: как добавить объект Person и вернуть personid, а затем добавить этот идентификатор с3 роли в таблице / ассоциации Personrole?

например

Person p = new Person();
p.name = "John"
......
entity.AddToPersons(p);
for(var roleid in Roleid)
entity.AddtoRoles(roleid)?

1 Ответ

2 голосов
/ 22 декабря 2010

EF не нужно для сопоставления таблиц соединения, когда нет ничего, кроме FK - это хорошо.Он достаточно умен, чтобы выполнить «тихое соединение» за кулисами.

ВОПРОС: как добавить объект Person и вернуть personid, а затем добавить этот идентификатор с 3 ролями в таблицу / связь Personrole?

Вам просто нужно использовать ассоциацию «Роли» в сущности «Персона».Вам не нужно добавлять прямо в таблицу «Роль».

Например:

// Create new Person
Person p = new Person();
p.Name = "John";

// Create new Role
Role r = new Role();
r.Description = "Administrator";

// Add new Role to this new Person
p.Roles.Add(r);

// Add Person to context (no need to add Role)
ctx.AddToPersons(p);

// Save Changes
ctx.SaveChanges();

Entity Framework довольно умный.Он увидит, что есть новая роль, сначала добавьте ее, затем добавьте человека, а затем добавьте запись в таблицу объединения на основе идентификатора только что созданной роли.

HTH.

РЕДАКТИРОВАТЬ - В ответ на комментарий:

thx, что если я хочу добавить существующую роль (например, Roleid = 1, description = "Editor")

Очень похоже на описанное выше.

Просто извлеките существующую роль из БД и добавьте ее к человеку:

Role r = ctx.Roles.SingleOrDefault(x => x.RoleId == 1 && x.Description == "Editor");
p.Roles.Add(r);
...