Удаление родительских сущностей без удаления связанных дочерних

Привет, я использую Entity framework для установки своей базы данных. У меня есть объект отношения «один-многие», и я хочу удалить только родительский объект без каскадного удаления. Я получаю сообщение об ошибке при удалении от родителей, но я действительно хочу сохранить своего ребенка в качестве причины записи. Есть ли способы удалить только родителей без ошибки?


person tamikoon    schedule 22.10.2013    source источник
comment
См. stackoverflow.com/questions/ 5048561/ или stackoverflow.com/questions/9136255/ , возможно. Попытка поиска при удалении установить значение null (которого в EF не существует как такового, но это должно привести к аналогичным решениям)   -  person user2864740    schedule 23.10.2013
comment
Спасибо за ответ, поэтому я использовал при удалении set null для дочернего объекта, но когда я удаляю родительский объект, удаляется весь дочерний объект, а не только внешний ключ дочернего объекта. Все еще застряли..   -  person tamikoon    schedule 23.10.2013


Ответы (1)


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

Коротко говоря, вам нужно загрузить свою дочернюю ассоциацию. Предполагая, что вы правильно настроили отношения и Foo имеет много Bars, этот код должен делать именно то, что вы хотите:

    public void Delete(Guid fooId)
    {
        using (var context = new MyDbContext())
        {
            var foo = context.Foos.Include("Bars").FirstOrDefault(foo => foo.Id == fooId);
            if (foo != null)
            {
                context.Foos.Remove(foo);
                context.SaveChanges();
            }
        }
    }

Ключевым здесь является вызов .Include. Без этого обновление завершится ошибкой с нарушением внешнего ключа.

Теперь, когда я говорю, что предполагаю, что вы правильно настроили отношения, я имею в виду, что они должны выглядеть так.

// Foo.cs
public class Foo
{
    public Guid Id { get; set; }

    public ICollection<Bar> Bars { get; set; }
}

// Bar.cs
public class Bar
{
    public Guid Id { get; set; }

    public Guid? FooId { get; set; }

    public virtual Foo Foo { get; set; }
}

// MyDbContext
modelBuilder.Entity<Foo>()
    .HasMany(e => e.Bars)
    .WithRequired(e => e.Foo)
    .HasForeignKey(e => e.FooId)
    .WillCascadeOnDelete(false);
person Samo    schedule 06.10.2015