1

次のようにリソースを更新しようとしています。

  public void Update(Resource resource) {

   Resource _resource = _resourceRepository.First(r => r.Id == resource.Id);

   _resource.Content = resource.Content;
   _resource.Description = resource.Description;
   _resource.Locked = resource.Locked;
   _resource.Name = resource.Name;

   _resource.Restrictions.ToList().ForEach(r => _resource.Restrictions.Remove(r));

   foreach (Restriction restriction in resource.Restrictions)
    _resource.Restrictions.Add(new Restriction { Property = _propertyRepository.First(p => p.Id == restriction.Property.Id), Value = restriction.Value });

  } // Update

私はリソースを作成するために似たようなものを持っていますが、違いは 1 つだけです。制限を削除しません。

次のエラーが表示されます。

「Restrictions_ResourceId_FK」AssociationSet からの関係は「削除済み」状態です。多重度の制約がある場合、対応する「制限」も「削除済み」状態でなければなりません。

私は何が欠けていますか?

4

2 に答える 2

11

EF はあなたが彼に言ったことを正確に実行しました。親オブジェクト ナビゲーション コレクションから項目を削除すると、親オブジェクトと子オブジェクトの間の関係のみが削除されます。これは、Restriction の ResourceId をエンティティ モデルで許可されていない null に設定するだけであることを意味します。

関連するリソースがなければ制限が存在できない場合は、関係を識別としてモデル化する必要があります。これは、制限の主キーにも ResourceId 列が含まれることを意味します。その後、親オブジェクト コレクションから制限を削除すると、EF は ResourceId を null に設定する代わりに制限を削除します。

于 2011-01-17T12:13:15.100 に答える
3

Add() の反対は明らかに Remove() のように見えたので、私は同様の問題を抱えていました。

子項目を削除するには、代わりに DeleteObject() 関数を使用する必要があります。

ありがとう。

于 2011-04-04T12:10:39.910 に答える