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