如何识别标记为级联删除的关联

时间:2010-08-17 12:15:59

标签: c# .net entity-framework entity-framework-4

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

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

Daniel的回答与此相同,但我提供了另一种解决方案。我做了一些挖掘,发现你可以在T4模板中为你的POCO做检查:

// 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的例子,但对于模板,我的例子将识别级联删除关联。