2009-07-15 36 views
0

Entity Frameworkのかなり単純なデータモデルだと思っています。 OrderHeaderとOrderLineという2つのエンティティがあります。Entity Frameworkの参照制約

OrderHeader

+---------+--------+ 
| Name | Type | 
+---------+--------+ 
| Id  | Int | 
| Name | String | 
+---------+--------+ 

オーダーライン

+---------+--------+ 
| Name | Type | 
+---------+--------+ 
| Id  | Int | 
| OrderId | Int | 
| Name | String | 
+---------+--------+ 

私はOrderHeader.OrderLines.Remove(someOrderLine)を呼び出すたびに、私はオーダーラインではなく、孤立し、それを残してのデータベースから削除したいが、私Entity Frameworkでこれを行うように見えることはありません。ドキュメントには、参照制約を使用する必要があると書かれていますが、その機能は動作していないようです(たとえば、http://msdn.microsoft.com/en-us/library/dd456813%28VS.100%29.aspxは存在しないメニューを指します)。何か案は?

答えて

0

誰かが私を助けましたこの状況に対処するために、次のヘルパー関数を記述してください。まず、ObjectContextは

private void DeleteOrphans<TEntity, TRelatedEntity>(Func<TEntity, EntityCollection<TRelatedEntity>> collectionAccessor) 
     where TEntity : EntityObject 
     where TRelatedEntity : EntityObject 
    { 
     ObjectStateManager.ObjectStateManagerChanged += (_, e) => 
     { 
      if (e.Action == System.ComponentModel.CollectionChangeAction.Add) 
      { 
       var entity = e.Element as TEntity; 
       if (entity != null) 
       { 
        var collection = collectionAccessor(entity) as System.Data.Objects.DataClasses.EntityCollection<TRelatedEntity>; 
        if (collection != null) 
        { 
         collection.AssociationChanged += (__, e2) => 
         { 
          if ((e2.Action == System.ComponentModel.CollectionChangeAction.Remove)) 
          { 
           var relatedEntity = e2.Element as TRelatedEntity; 
           if (relatedEntity != null) 
           { 
            DeleteObject(relatedEntity); 
           } 
          } 
         }; 
        } 
       } 
      } 
     }; 
    } 

の内側に、このヘルパー関数を定義し、コンテキストのコンストラクタでは、我々は次のように何かを呼び出す:のみ、私はときに私注文ラインを削除したい場合は動作します

DeleteOrphans<OrderHeader, OrderLine>(x => x.OrderLines); 
0

あなただけのオーダーラインを取り除くしたい場合は、OrderHeader.OrderLines.Remove(someOrderLine)あなたとの関係を削除する(すなわちforiegnキー)を呼び出すときに何かのように:

context.DeleteObject(someOrderLine); 
    context.SaveChanges(); 
+0

をOrderHeaderを削除します。 OrderLineをOrderHeaderのOrderLinesコレクションから削除したときにOrderLineを削除したい – LPCRoy

+0

申し訳ありませんが、誤解されています – NikolaiDante

関連する問題