Entity framework 无法更改关系,因为一个或多个外键属性不可为null?
根据这里公认的答案: 在使用Entity framework 无法更改关系,因为一个或多个外键属性不可为null?,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,根据这里公认的答案: 在使用entity.Children.Clear()更新实体之前,我已删除了所有子项: 我得到了这个错误: 操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当 对关系进行更改时,相关的外键属性为 设置为空值。如果外键不支持空值, 必须定义新关系,外键属性必须为 指定了另一个非空值,或者必须为不相关的对象 删除 出现此问题的原因是,您试图从关系的一端删除某些内容,而不是从另一端删除,并且另一端的内容不可为空 最简单的解决方案是启用级联删除,然后让EF担心细节,但如果
entity.Children.Clear()
更新实体之前,我已删除了所有子项:
我得到了这个错误:
操作失败:无法更改关系,因为
一个或多个外键属性不可为空。当
对关系进行更改时,相关的外键属性为
设置为空值。如果外键不支持空值,
必须定义新关系,外键属性必须为
指定了另一个非空值,或者必须为不相关的对象
删除
出现此问题的原因是,您试图从关系的一端删除某些内容,而不是从另一端删除,并且另一端的内容不可为空
最简单的解决方案是启用级联删除,然后让EF担心细节,但如果您必须处理此问题,那么您需要做的是删除所有项目,按原样使用,但也要在每个项目上将相关项目设置为null,如果不能为null,您也必须删除相关项目。我想您在某个表中指定了一个外键,该外键不可为null。。尝试删除该关系我是否应该在关系的另一端定义导航属性以删除它?(保持一对多关系的一端)?
public static JsonViewData AddOrUpdate(ModelDBContext context, GENCompanyViewModel companyModel, string userName, string userId)
{
try
{
var company = new GENCompany();
if (companyModel.Id > 0) //Update
{
company = context.Companies.Find(companyModel.Id);
context.Entry(company).State = EntityState.Modified;
company.Vehicles.Clear();
company.Phones.Clear();
company.Emails.Clear();
company.InjectFrom(companyModel);
company.DateUpdated = DateTime.Now;
}
else //Add
{
company.InjectFrom(companyModel);
company.CreatedById = new Guid(userId);
context.Companies.Add(company);
context.SaveChanges(userName);
}
if (companyModel.Vehicles.Any())
{
foreach (var vehicleModel in companyModel.Vehicles)
{
var vehicle = context.Vehicles.Find(vehicleModel.Id);
context.Entry(vehicle).State = EntityState.Unchanged;
company.Vehicles.Add(vehicle);
}
}
if (companyModel.Phones.Any())
{
foreach (var phoneModel in companyModel.Phones)
{
var phone = new GENCompanyPhone();
phone.InjectFrom(phoneModel);
company.Phones.Add(phone);
}
}
if (companyModel.Emails.Any())
{
foreach (var emailModel in companyModel.Emails)
{
var email = new GENCompanyEmail();
email.InjectFrom(emailModel);
company.Emails.Add(email);
}
}
context.SaveChanges(userName);
return new JsonViewData { IsSuccess = true, Message = "Added Successfully" };
}
catch (Exception ex)
{
return new JsonViewData { IsSuccess = false, Message = ex.InnerException?.InnerException?.Message ?? ex.InnerException?.Message ?? ex.Message };
}
}