Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 实体框架-反映外键和关系/关联_.net_Entity Framework_Reflection_Foreign Keys_Foreign Key Relationship - Fatal编程技术网

.net 实体框架-反映外键和关系/关联

.net 实体框架-反映外键和关系/关联,.net,entity-framework,reflection,foreign-keys,foreign-key-relationship,.net,Entity Framework,Reflection,Foreign Keys,Foreign Key Relationship,我遇到了一个具有挑战性的问题,我想在实体框架映射上使用反射来查找引用表的所有外键,并且我想要作为外键的列的名称 根据,我可以通过反射轻松找到表上的导航属性。但这并没有给出包含外键值的属性或列的名称 我尝试这样做的原因是我有大量的表(将近40个)引用一个表中的项目。假设用户在items表中输入一个名为“Andew”的新值,然后管理员注意到它实际上只是已经存在的item“Andrew”的一个输入错误。现在我想找到所有对“Andew”的引用,并将这些引用更改为“Andrew”。我更愿意有效地执行此操作

我遇到了一个具有挑战性的问题,我想在实体框架映射上使用反射来查找引用表的所有外键,并且我想要作为外键的列的名称

根据,我可以通过反射轻松找到表上的导航属性。但这并没有给出包含外键值的属性或列的名称

我尝试这样做的原因是我有大量的表(将近40个)引用一个表中的项目。假设用户在items表中输入一个名为“Andew”的新值,然后管理员注意到它实际上只是已经存在的item“Andrew”的一个输入错误。现在我想找到所有对“Andew”的引用,并将这些引用更改为“Andrew”。我更愿意有效地执行此操作,因此使用反向导航属性的速度太慢,因为您必须在修改值之前加载这些值。我想做的是能够反映表和列的列表,然后直接向数据库发出更新命令。它看起来像这样:

var command = String.Format("UPDATE [{0}] SET [{1}] = {{1}} WHERE [{1}] = {{0}}; ", fk.FromTableName, fk.FromColumnName);
dataContext.ExecuteStoreCommand(command, new Object[] { oldID, newID });
在LINQtoSQL中,这实际上非常简单。。。对LINQ自动生成的代码进行了20行反射,我已经完成了,但是我们最近切换到了EF,我无法通过EF找到外键列的名称


我正在寻找的一个简单示例是:如果我有一个名为Employee的对象,其导航属性为Manager,外键为ManagerID,那么我想知道Manager是我的导航属性,底层存储是ManagerID属性。我希望严格通过反射或元数据来实现这一点,这样我就可以从中构建动态查询。

一旦您使用了链接问题中的想法来获得您感兴趣的
EntityType
,请注意
EntityType
继承自
EntityTypeBase
,它有一个属性
KeyMembers
,它是参与实体密钥的所有
EdmMembers
的集合


每个
EDM成员
都有一个
名称
,它将是您要查找的字符串
“ManagerID”

为了节省时间,我想抛出这是不是正确答案,但您可以通过SQL中的系统视图来执行我的要求。我已经尝试过这个方法,它很管用,但它让我感到困扰,我可以通过LINQ到SQL轻松地获取这些数据,但我在EF中根本找不到它。如果没有其他选择,我将不得不使用下面的解决方案。(但EF必须在内部某处拥有此数据……我只想访问它。)


希望这个错误的答案至少对我以外的人有用。。。(另外,仅供参考,这个解决方案需要更多的代码来处理多列PKs-我的PKs都是单列的)。

这个问题的答案在这里的另一篇文章中:


请注意,海报的答案对我来说并不适用。使用@Ashraf的答案,效果很好。

你投了反对票,所以我想我不是唯一一个有点不明白你在追求什么的人。您可以只执行
employee.managerId
employee.manager.id
?您必须知道约定是什么,您的DBA不能简单地更改DB而不以其他方式影响您的项目。@Eonasdan-谢谢。我想知道为什么我被否决了。我完全重写了,希望能让它更清楚。不幸的是,现在它长了很多,我想尽量缩短它。这是一个好主意,但我需要获取当前对象上外键的名称,而不是外键的名称。这是myObject.ManagerID和myObject.Manager.ID之间的区别。我们不使用Manager.ManagerID的约定-我们使用Manager.ID-因此列在每一端的命名都不同。
select K.name as RelationshipName, T1.name as FromTable, C1.name as FromColumn, T2.name as ToTable, C2.name as ToColumn
from sys.foreign_keys as K
join sys.foreign_key_columns as C on K.object_id = C.constraint_object_id
join sys.columns as C1 on K.parent_object_id = C1.object_id 
join sys.tables as T1 on K.parent_object_id = T1.object_id 
join sys.columns as C2 on K.referenced_object_id = C2.object_id
join sys.tables as T2 on K.referenced_object_id = T2.object_id 
where C1.column_id = C.parent_column_id
and C2.column_id = C.referenced_column_id
and T2.Name = 'Employee'
order by T1.Name, C1.Name