Невозможно сохранить отношения многие ко многим - PullRequest
2 голосов
/ 17 июня 2011

У меня есть следующие таблицы / представления

Users (View)
-> UserId
-> Name

Roles (Table)
-> RoleId
-> Name

UserRoles (Table)
-> UserId
-> RoleId

и классы

public class Role{
     public int RoleId{get;set}
     public string Name{get;set}
}

public class User{
     public int UserId{get;set}
     public string Name{get;set}
     public ICollection<Role> Roles{get;set}
}

и метод сохранения

using (var helper = new DbContext())
{
     helper.Users.Attach(user);
     helper.SaveChanges();
}

Как вы можете видеть выше,Users - это представление, а UserRoles - таблица сопоставления.Я могу получить объекты пользователя вместе с назначенными ролями.Но при сохранении это не исключение и не сохранение.Я попытался проверить БД с помощью профилировщика, и он даже не попал в БД.

Поскольку Users - это представление, я не хочу сохранять сущность User, а только изменения, внесенные в коллекцию ролей.

1 Ответ

3 голосов
/ 17 июня 2011

Это ничего не может спасти. Attach помещает весь граф объекта в контекст, но в состоянии Unchanged. Если все объекты в контексте неизменны, SaveChanges не будет выдавать команду БД (потому что для EF ничего не изменилось).

Если вы хотите внести изменения, которые EF распознает как таковые, вы должны сначала присоединить объект, который представляет состояние в БД, а затем внести изменения, например:

using (var helper = new DbContext())
{
    helper.Users.Attach(user);
    helper.Roles.Attach(myNewRole);
    user.Name = myNewName;
    user.Roles.Add(myNewRole);
    // etc.
    helper.SaveChanges();
}

Также вы можете пометить пользователя как измененного:

helper.Entry(user).State = EntityState.Modified;

Но я считаю, что это влияет только на скалярные свойства объекта, и это не решает проблему добавления новой роли пользователю.

...