繁体   English   中英

从具有一对多关系的实体中删除对象

[英]Delete object from entity with relation one-to-many

我通过ID从db获得requestRequest 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 ,将其标记为DeletedSave ,但这无济于事。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM