在Edit
期间,我必须使用表单中的值更新某些表,并且还必须在表上添加一些新记录。
我总是得到同样的错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
我的观点模型如下:
public class CorporateCustomerUpdateViewModel
{
public Guid Id { get; set; }
public string FullName { get; set; }
public CorporateCustomerViewModel CorporateCustomer { get; set; }
}
public class CorporateCustomerViewModel
{
public int BusinessTypeId { get; set; }
public List<CorporateMemberViewModel> CorporateMembers { get; set; }
}
public class CorporateMemberViewModel
{
public string IdNumber { get; set; }
public string Name { get; set; }
public string Document { get; set; }
}
实体:
public class User
{
public Guid Id { get; set; }
public string FullName { get; set; }
public virtual CorporateCustomer CorporateCustomer { get; set; }
}
public class CorporateCustomer
{
public int BusinessTypeId { get; set; }
public virtual ICollection<CorporateMember> CorporateMembers { get; set;}
}
public class CorporateMember
{
public string IdNumber { get; set; }
public string Name { get; set; }
public string Document { get; set; }
}
我正在使用AutoMapper将视图模型中的字段映射到实体。
配置如下:
public class CorporateCustomerMapper : Profile
{
CreateMap<CorporateCustomerUpdateViewModel, User>();
}
我正在尝试更新User
表,如下所示:
public void UpdateCorporateCustomerDetail(CorporateCustomerUpdateViewModel model)
{
var userRepo = _genericUnitOfWork.GetRepository<User, Guid>();
var user = userRepo.GetById(model.Id);
var entity = _mapper.Map(model, user);
//mapping CorporateCustomerUpdateViewModel to User
userRepo.Update(entity);
_genericUnitOfWork.SaveChanges();
}
GetById
public TEntity GetById(TKey id)
{
return _dbSet.Find(id);
}
在MAP之后,user.CorporateCustomer.CorporateMembers
变为空
因为model.CorporateCustomer.CorporateMembers
没有价值。
但是这不应该是null,因为在CorporateMembers
期间我在数据库中已经有一些GetById
。
我认为这是问题,因为EF将更新空条目。
此处提供的链接是关于相同方案的讨论。
How to add/update child entities when updating a parent entity in EF
我已经浏览了这两个链接。但是有一个ChildObjects
和没有AutoMapper的讨论。我无法弄清楚我在哪里做错了什么,以及我应该在哪里更改我的代码。
请您建议一些代码更改或一些提示?