![](/img/trans.png)
[英]Can EF automatically delete data that is orphaned, where the parent is not deleted?
[英]Automatically delete orphaned childs: Childs will not be deleted for the second Commit
進一步質疑EF是否可以自動刪除孤立的數據,而不刪除父數據?
我檢查了解決方案,就像@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邏輯絕對不理想。
編輯:
迭代只是真實場景的一個示例。 在實際情況下,用戶可以添加父實體的第一個孩子。 保存數據,然后再次刪除第一個孩子,並在其位置添加另外兩個孩子
事實證明,這個問題非常愚蠢。 我的實體從基類繼承,該基類基於唯一的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;
}
感謝您的關注和幫助的渴望
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.