我使用的是EF 4.0,在我的实体数据模型中,我有几个关系,其中我有一对多的关联,并将关联标记为级联OnDelete。有没有一种方法可以通过编程来识别实体类型T的这些关联?
我想到的一个选择是标识这些关联,并在我的T4模板中注释导航属性,标识它们是级联删除。当然,我需要知道如何识别关联是否在我的T4模板中被标记为Cascade Delete。
发布于 2010-08-17 21:21:47
通过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...
}
}
}
}仅供参考,我认为上面的代码可能会标识相同的关系两次(每端一次)。
发布于 2010-08-17 22:18:53
Daniel的答案与此相同,但我提供了另一种解决方案。我做了一些调查,发现你可以在你的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的示例,但是对于模板,我的示例将标识级联删除关联。
https://stackoverflow.com/questions/3502256
复制相似问题