2010-08-17 44 views
2

我正在使用EF 4.0,并且在我的实体数据模型中,我有几个关系,我有一对多关联并将关联标记为Cascade OnDelete。有没有一种方法可以通过编程的方式为实体类型T识别这些关联?如何识别标记为级联的关联删除

我想到的一个选择是识别这些关联,并在我的T4模板中注释导航属性,标识它们是级联删除。当然,我需要知道如何确定一个关联是否在T4模板中标记为级联删除。

回答

3

您可以通过MetadataWorkspace类以编程方式发现比您想要了解的实体模型更多的内容。然而,API是一个挑战。下面是如何发现的关系(通过导航性能)的一个例子及其相关OnDelete设置:

using (var context = new AppEntities()) 
{ 
    var container = context.MetadataWorkspace.GetEntityContainer("AppEntities", System.Data.Metadata.Edm.DataSpace.CSpace); 

    foreach (var entitySet in container.BaseEntitySets.OfType<EntitySet>()) 
    { 
     var elementType = entitySet.ElementType; 

     foreach (var np in elementType.NavigationProperties) 
     { 
      if (np.FromEndMember.DeleteBehavior == OperationAction.Cascade) 
      { 
       var entityType = np.FromEndMember.GetEntityType(); 

       // do stuff... 
      } 

      if (np.ToEndMember.DeleteBehavior == OperationAction.Cascade) 
      { 
       var entityType = np.ToEndMember.GetEntityType(); 

       // do stuff... 
      } 
     } 
    } 
} 

仅供参考,我觉得上面的代码可以识别两次同样的关系(从一次每端)。

1

丹尼尔的答案将与此相同,但我提供了一个替代解决方案。我做了一些挖掘和发现,你可以在你的POCO是你的T4模板做此项检查:

// Iterates the Navigation properties for the entity 
foreach (NavigationProperty navProperty in entity.NavigationProperties.Where(np => np.DeclaringType == entity)) 

// Checks if the navigation property is Cascade Delete. 
if (ef.IsCascadeDeletePrincipal(navProperty)) 

我能包含所有我需要知道的信息的检查中添加注释。

以编程方式,我会遵循Daniel的示例,但对于模板,我的示例将标识级联删除关联。