进一步提问Can EF automatically delete data that is orphaned, where the parent is not deleted?
我检查了解决方案,正如@Ladislav在这里建议的那样 https://stackoverflow.com/a/10838228/54801 不幸的是我注意到解决方案部分有效。
如果我们采用以下代码:
for (int k = 0; k < 2; k++)
{
var parentObject= _context.Parents.Get(1704);
parentObject.ChildObjects.Clear();
var childObject= _context.ChildObjects.Get(1000*k /*diffrent child for each iteration*/ );
parentObject.ChildObjects.Add(childObject);
_context.Commit();
}
第一次迭代(k = 0)进行了删除。 但第二次迭代不会删除!
有没有人能解决这个问题?
问题可以“解决”,如下所示:
if(k == 1)
{
foreach (var project in tender.TenderProjects)
{
_context.Projects.Remove(project);
}
}
但这绝对不是理想的 我希望我的服务不受任何ORM逻辑的影响..
修改
迭代只是真实场景的一个例子。真实情况下,用户可以添加父实体的第一个子节点。保存数据并再次删除第一个孩子并在其位置添加另外两个孩子
答案 0 :(得分:1)
事实证明这个问题非常愚蠢。我的实体继承自基类,它基于唯一ID来嵌入方法Equals和GetHashCode。
public override bool Equals(object obj)
{
if (obj == null || !(obj is Entity))
return false;
if (Object.ReferenceEquals(this, obj))
return true;
Entity item = (Entity)obj;
if (item.IsTransient() || this.IsTransient())
return false;
else
return item.Id == this.Id;
}
public override int GetHashCode()
{
if (!IsTransient())
{
if (!_requestedHashCode.HasValue)
_requestedHashCode = this.Id.GetHashCode() ^ 31;
return _requestedHashCode.Value;
}
else
return base.GetHashCode();
}
因为我的实体有一个复合键。 我需要覆盖与复合键相关的方法。
public override bool Equals(object obj)
{
if (obj == null || !(obj is ProjectContract))
return false;
if (Object.ReferenceEquals(this, obj))
return true;
var item = (ProjectContract)obj;
if (item.IsTransient() || this.IsTransient())
return false;
return item.Id == this.Id && item.ProjectId == this.ProjectId;
}
int? _requestedHashCode;
public override int GetHashCode()
{
if (!_requestedHashCode.HasValue)
_requestedHashCode = (this.Id.ToString() + this.ProjectId.ToString()).GetHashCode();
return _requestedHashCode.Value;
}
感谢您的关注和帮助