entity framework 5, удалить отношение один ко многим?

отношение сущности A, B одно ко многим, (A имеет много Bs, B должно принадлежать A).

и lazy loading и загрузите A, B вот так:

dbContext.As.Load();
//**particaly load B** 
dbContext.Bs.Where(predicateX).Load();

когда я использую

dbContext.As.Remove(someA)

чтобы удалить A, я сталкиваюсь со следующим сообщением об ошибке

The relationship could not be changed because one or more of the foreign-key properties is non-nullable

вместо этого, если я использую:

//remove all B in someA
foreach(B b in someA.Bs.ToList())
{
   dbContext.Bs.Remove(b);
}
dbContext.As.Remove(someA)

все ок.

есть ли лучший способ сделать это?

редактировать


сначала я использую базу данных и добавляю ограничение внешнего ключа B (на каскаде удаления) на стороне базы данных.

Я думаю, что " ограничение внешнего ключа "просто равно коду"OnModelCreating". но код " dbContext.Как.Remove (someA)" работает не так, как ожидалось.

все становится хуже, когда есть A-B-C Каскад один ко многим отношениям.чтобы удалить someA, вам нужно сделать как это

foreach(B b in someA.Bs.ToList())
{
  foreach(C c in b.Cs.ToList())
  {
    dbContext.Cs.Remove(c);
  }
  dbContext.Bs.Remove(b);
}
dbContext.As.Remove(someA);

решила:


сначала я использую базу данных (sqlite) и добавляю ограничение внешнего ключа на стороне базы данных.

используйте vs2012 для создания edmx из файла базы данных sqlite,

vs2012 не удалось установить свойство "on delete cascade" отношения.

после ручной установки свойства, один вызов " dbContext.Как.Remove (someA) " работайте как ожидалось!

1 ответов


к сожалению, в Entity Framework (в настоящее время) нет пакетной поддержки, поэтому вы застряли foreach - ing через несколько свойств. Вы можете посмотреть на EntityFramework.Продлен project, который добавляет различные пакетные операции для очистки такого кода (а также повышения производительности).

Если вы уверены, что всегда хотите удалить связанные B при удалении A, то настройте эту связь для использования поведения "on delete cascade". Что это значит это когда родитель a удаляется, все его дочерние B также автоматически удаляются. Как это сделать зависит от того, как вы создали базу данных. Если вы используете код первым, это будет что-то вроде этого:

public class MyContext : DbContext
{
    public DbSet<A> As { get; set; }
    public DbSet<B> Bs { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<A>()
                    .HasMany(a => a.Bs)
                    .WithRequired(b => b.A)
                    .WillCascadeOnDelete();
    }
}