首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何标识标记为级联删除的关联

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

Stack Overflow用户
提问于 2010-08-17 20:15:59
回答 2查看 463关注 0票数 2

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-17 21:21:47

通过MetadataWorkspace类,您可以通过编程方式发现更多关于您的实体模型的信息。然而,要弄清楚这个API有点困难。以下是如何发现关系(通过导航属性)及其关联的OnDelete设置的示例:

代码语言:javascript
复制
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...
            }
        }
    }
}

仅供参考,我认为上面的代码可能会标识相同的关系两次(每端一次)。

票数 3
EN

Stack Overflow用户

发布于 2010-08-17 22:18:53

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

代码语言:javascript
复制
// 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的示例,但是对于模板,我的示例将标识级联删除关联。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3502256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档