1

質問に加えて、親が削除されていない孤立したデータを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) は削除を実行しました。しかし、2 回目の繰り返しでは削除されません。

誰かが問題の解決策を持っていますか?

この問題は、次のように「解決」できます。

if(k == 1)
{
    foreach (var project in tender.TenderProjects)
      {
         _context.Projects.Remove(project);
      }
   }

しかし、サービスをORMロジックから除外したいのは間違いなく理想的ではありません..

編集:

反復は、実際のシナリオの一例にすぎません。実際のシナリオでは、ユーザーは親エンティティの最初の子を追加できます。データを保存し、もう一度行って最初の子を削除し、代わりに他の 2 つの子を追加します

4

1 に答える 1

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;
    }

ご関心をお寄せいただき、ありがとうございます。

于 2012-10-21T12:28:28.793 に答える