2009-07-15 9 views
0

J'essaie de configurer ce que je pense être un modèle de données assez simple dans Entity Framework. J'ai deux entités, OrderHeader et OrderLine.ReferentialConstraint dans Entity Framework

OrderHeader

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

OrderLine

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

Chaque fois que j'appelle OrderHeader.OrderLines.Remove (someOrderLine), je veux la ligne de commande à supprimer de la base de données au lieu de le laisser orphelin, mais je ne peut pas sembler faire cela dans Entity Framework. La documentation indique que je devrais utiliser une contrainte référentielle, mais cette fonctionnalité ne semble pas fonctionner (par exemple, http://msdn.microsoft.com/en-us/library/dd456813%28VS.100%29.aspx fait référence à des menus qui n'existent pas). Des idées?

Répondre

0

Quelqu'un m'a aidé écrire la fonction d'assistance suivante pour faire face à cette situation. D'abord, nous définissons cette fonction d'assistance à l'intérieur du 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); 
           } 
          } 
         }; 
        } 
       } 
      } 
     }; 
    } 

Et puis dans le constructeur pour le contexte, nous appelons quelque chose de similaire à:

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

Lorsque vous appelez OrderHeader.OrderLines.Remove (someOrderLine) votre retrait de la relation (la touche foriegn) si vous voulez simplement se débarrasser de la ligne de commande faire quelque chose comme:

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

qui ne fonctionne que si je veux supprimer les OrderLines quand je supprimez le OrderHeader. Je veux supprimer la ligne de commande lorsque je l'enlève de la collection de OrderLines de OrderHeader – LPCRoy

+0

désolé, mal compris, je vais modifier – NikolaiDante