【问题标题】:Automatically delete orphaned childs: Childs will not be deleted for the second Commit自动删除孤儿:第二次Commit不会删除Childs
【发布时间】:2012-10-21 20:28:28
【问题描述】:

进一步提问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 逻辑..

编辑:

迭代只是真实场景的一个例子。真实场景,用户可以添加父实体的第一个子实体。保存数据并再次删除第一个孩子并在他的位置添加另外两个孩子

【问题讨论】:

  • 在第二次迭代中,父 1704 已经与子 27788 相关。删除然后添加该子可以让您回到开始的位置,因此当您调用 SaveChanges 时应该无事可做。
  • 迭代只是真实场景的一个例子。真实场景,用户可以添加父实体的第一个子实体。保存数据并再次删除第一个孩子并在他的位置添加另外两个孩子
  • 你能提供一个简单的模型和代码来重现这个问题吗?

标签: c# entity-framework entity-framework-5


【解决方案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;
    }

感谢您的关注和帮助

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 2012-10-22
    • 2010-09-23
    • 2012-09-16
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多