[英]Delete object from entity with relation one-to-many
我通过ID从db获得request
: Request originalRequest = RequestRepository.GetById(id);
然后我从请求注释中获取用户ID:
var origRecipientsIds = originalRequest.Comments.Select(c => c.User.Id).ToList();
从输入模型中,我收到了新用户(ID)
var editedRecipientsIds = model.Recipients.ToList();
然后按用户ID删除评论:
var recipientsIdToRemove = origRecipientsIds.Where(x => !editedRecipientsIds.Contains(x));
var recipientsToRemove = GetRecipientsToRemove(originalRequest, recipientsIdToRemove);
recipientsToRemove.ToList().ForEach(x => originalRequest.Comments.Remove(x));
GetRecipientsToRemove
方法返回的集合RequestComment
的
private IEnumerable<RequestComment> GetRecipientsToRemove(Request originalRequest,
IEnumerable<int> recipientsIdsToRemove)
{
var recipientsToRemove = new List<RequestComment>();
foreach (var id in recipientsIdsToRemove)
{
int localId = id;
var origComment = originalRequest.Comments.FirstOrDefault(x => x.User.Id == localId);
if (!recipientsToRemove.Contains(origComment))
{
recipientsToRemove.Add(origComment);
}
}
return recipientsToRemove;
}
毕竟,我调用SaveChanges
方法
RequestRepository.Context.Entry(originalRequest).State = EntityState.Modified;
RequestRepository.SaveChanges();
并得到错误
由于一个或多个外键属性不可为空,因此无法更改该关系。 对关系进行更改时,相关的外键属性将设置为空值。 如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
实体RequestComment
具有不可为空的FK来Request
public class RequestComment : IIdent
{
[ForeignKey("Request")]
public int RequestId { get; set; }
...
}
我试图再次从db获取requestComment
,将其标记为Deleted
和Save
,但这无济于事。
var dbComment = RequestCommentRepository.FindFirstOrDefault(x => x.User.Id == localId
&& x.RequestId == originalRequest.Id);
RequestCommentRepository.Context.Entry(dbComment ).State = EntityState.Deleted;
RequestCommentRepository.SaveChanges();
在删除接收者实体之前,您似乎无法解析备份DBMS中的实体之间存在外键关系。 它可能在注释实例和收件人实例之间。
确保您了解数据库的依赖关系。 首先删除独立实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.