У меня есть необязательный внешний ключ, который я пытаюсь установить равным null. Независимо от того, что я пробовал, в SaveChanges() оператор update устанавливает внешний ключ в предыдущее значение вместо null.Невозможно установить внешний ключ в нуль
упрощенный Ребенок Класс:
public class Child
{
[Key, Column(Order = 0), ScaffoldColumn(false)]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("Parent")]
public int? ParentId { get; set; }
public virtual Parent Parent { get; set; }
}
Упрощенная Родитель Класс:
public class Parent
{
[Key, Column(Order = 0), ScaffoldColumn(false)]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
Вещи, которые я пробовал:
- Загрузите объект Ребенок и установить ParentID нуль и установить От родителя до нуля
- Загрузите объект Child и установите Pa rentId null и принудительно изменить состояние объекта
- Загрузите объект Child, включая родительский объект, затем установите значения в значение null и принудительно измените состояние объекта.
- Загрузите родительский объект, а затем объект Child и. Удалить (дочерний элемент) из родительского объекта
- Загрузите родительский объект, затем объект Child и .Remove (child) из родителя и установите для Child.ParentId значение null и Child.Parent равным null.
В настоящее время у меня есть:
public void RemoveChildFromParent(int childId, int parentId)
{
Parent parent = _context.Parents.Include(x => x.Children).FirstOrDefault(u => u.Id == parentId);
Child child = parent.Children.SingleOrDefault(u => u.Id == childId);
parent.Children.Remove(child);
child.ParentId = null;
child.Parent = null;
child.StateOfEntity = StateOfEntity.Modified;
_context.ApplyStateChanges();
_context.SaveChanges();
}
на Save Changes, Заявление SQL Update по-прежнему устанавливает ParentID на объекте ребенка к старому значению, и я получаю эту ошибку:
System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: A referential integrity constraint violation occurred: The property values that define the referential constraints are not consistent between principal and dependent objects in the relationship.
Source=System.Data.Entity
StackTrace:
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
at Insight.DataLayer.InsightContext.SaveChanges()
at Insight.DataLayer.ChildRepository.RemoveChildFromParent(Int32 childId, Int32 parentId)
at Insight.BusinessLayer.ParentManager.RemoveChild(Int32 id, Int32 parentId)
at Insight.PresentationLayer.Controllers.ParentController.RemoveChild(Int32 id, Int32 parentId)
at lambda_method(Closure , ControllerBase , Object[])
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
InnerException:
Кроме того, не уверен, имеет ли это значение, но у меня есть LazyLoadingEnabled = false и AutoDetectChangesEnabled = false.
Что происходит, когда вы напрямую запускаете запрос для удаления внешнего ключа? – NotMe
@ChrisLively, извините за задержку. Он отлично работает, выполняя команду вручную или используя 'DbContext.Database.ExecuteSqlCommand()', поэтому я, вероятно, просто придерживаюсь этого. Похоже, что это не совсем соответствует методологии, но бьет еще один день на эту небольшую проблему. –