实体框架 - 反向外键检查

时间:2011-05-12 06:23:59

标签: entity-framework reflection foreign-keys entity foreign-key-relationship

我们有一个系统允许管理员在系统中构建新​​的内容类型,包括与其他表的外键链接。然后,管理员可以重建数据库,此时它会创建表和所有必要的关系,然后重建EDMX并重新编译所有内容。像冠军一样工作(我没有写它或者我可能知道答案)。

我们遇到的一个缺点是当用户去删除可能由另一个表中的项链接的记录时。由于参照完整性,这会引发错误。当然,我正在捕捉这个,但我现在所能提供的只是一个通用的“你不能删除这个项目,因为它与某种类型的错误相关联。我更愿意检查项目是否可删除,如果没有则禁用该按钮。

有没有办法在运行时确定待删除项目链接到哪个表/行?通常,我只是查询相关的表,但由于这个应用程序的性质,我不知道那些其他表在设计时会是什么。

简而言之,如果我有:

Foo:FooID,FooName 栏:BarID,FooID,BarName Pow:PowID,FooID,PowName

是否可以在运行时告知由于来自Bar或Pow的FK链接而无法删除Foo中的行,如果是这样,我可以告诉哪个表导致错误吗?

提前致谢;首先在这里张贴所以请原谅任何礼仪流氓:)。

1 个答案:

答案 0 :(得分:2)

您必须查询元数据并获取所有导航属性的列表

ObjectSet = context.CreateObjectSet<YourEntityType>();

// Get entity set for current entity type
var entitySet = ObjectSet.EntitySet;
// Get name of the entity's navigation properties
_propertyNames = ((EntityType)entitySet.ElementType).NavigationProperties.Select(p => p.Name).ToArray();

现在您拥有必须在删除前检查的属性。要检查属性,必须加载这些成员,并且必须检查相关实体是否存在。两者都可能需要大量的反射,这会影响应用程序的性能。

我不得不说你的应用程序架构很糟糕。这就像一个例子:EF应该在哪里使用,或者不应该使用EF。