2009-07-15 43 views
0

我试图设置我认为是实体框架中非常简单的数据模型。我有两个实体,OrderHeader和OrderLine。实体框架中的ReferentialConstraint

OrderHeader

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

订单行

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

每当我打电话OrderHeader.OrderLines.Remove(someOrderLine),我想要的订单行从数据库中而不是把孤儿被删除,但我似乎无法在实体框架中做到这一点。文档声明我应该使用引用约束,但该功能似乎不起作用(例如,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

,只有当我想,当我删除OrderLines工作删除OrderHeader。我想从OrderHeader的OrderLines集合中删除它时删除OrderLine – LPCRoy 2009-07-15 21:30:35