EF 4.1 Удалять «многие ко многим» родитель должен удалить связанных детей - PullRequest
1 голос
/ 09 февраля 2012

EF 4.1 База данных Первый подход.

Допустим, у меня есть эта схема таблицы

Пользователи 1 --- M UserRoles M --- 1 роли

Каскадное удаление настраивается во внешних ключах

В таблице UserRoles есть дополнительные столбцы, такие как CreatedDate, поэтому я создаю модель для UserRoles и сопоставляю ее соответственно.

Я получаю следующие модели:

User
----
int Id
string Name
List<UserRoles> UserRoles

UserRoles
---------
int UserId
int RoleId
DateTime CreatedDate
User User
Role Role

Role
----
int Id
string Name
List<UserRoles> UserRoles

Если у меня правильная конфигурация, могу ли я удалить пользователя и удаляются ли строки ролей пользователя БЕЗ очисткиколлекцию UserRoles вручную?

Так что я могу просто сделать это:

DbContext.Entry(user).State = EntityState.Deleted;
DbContext.SaveChanges();

Или я ДОЛЖЕН сделать это:

user.UserRoles.Clear();
DbContext.Entry(user).State = EntityState.Deleted;
DbContext.SaveChanges();

Мое тестирование показывает, что Я ДОЛЖЕНОчистите дочернюю коллекцию, но я нахожу противоречивую информацию о том, что, если у меня правильно установлена ​​каскадная установка, она должна работать только путем удаления пользователя.

Когда я НЕ очищаю UserRoles, я получаю эту ошибку:

Отношение не может быть изменено, потому что одно или несколько свойств внешнего ключа не могут быть обнулены

Спасибо за помощь в разъяснении этого!

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Вы должны использовать

DbContext.Users.Remove(user);

Это не то же самое, что установить состояние на Deleted.Установка состояния не помечает никакие дочерние объекты с установкой каскадного удаления как Deleted, но Remove подойдет.

Установка состояния на Deleted должна работать ЕСЛИ детей нетзагружен в контекст, потому что EF отправит в базу данных только оператор DELETE для родителя, а база данных также удалит дочерние элементы из-за каскадного удаления в базе данных.

IF однакоВы загрузили дочерние элементы в контекст, установив состояние родительского элемента на Deleted, не установившее состояние дочерних элементов.EF выдаст исключение, это не база данных, кто жалуется.

1 голос
/ 09 февраля 2012

Вы должны быть в состоянии указать, что удаление роли или пользователя, в свою очередь, приведет к удалению дочерних грантов.Вы можете использовать метод WillCascadeOnDelete () в свободном API DbModelBuilder:

modelBuilder.Entity<UserRoles>
    .HasRequired(d => d.User)
    .WithMany(p => p.UserRoles)
    .HasForeignKey(d => d.UserId)
    .WillCascadeOnDelete();

modelBuilder.Entity<Role>
    .HasMany(p => p.UserRoles)
    .WithRequired(d => d.Role)
    .HasForeignKey(d => d.RoleId)
    .WillCascadeOnDelete();

При этой установке удаление пользователя или роли должно также удалить все пользовательские роли.

...