c# - 如何知道列是否在实体框架中具有外键
问题描述
我是实体框架的新手,
要更新单元格值,如果当前字段与另一个 sql 表(实体类)有关系,我想获取该外部表(在 daragridview 等中显示以从那里选择一个新值)
但我不知道该怎么做?你能给我一个小例子吗?
附加:不幸的是,我找到了一个基于 sql (ADO.NET) 而不是 EF 的解决方案,以检查是否存在关系的列
如果有,用哪张桌子?答案是对我的询问;
select
tp.name 'ParentTable', cp.name as ForeignInParent, tr.name 'ForeignTable', cr.name ForeignValueMember, fk.name FK_Name
FROM sys.foreign_keys fk
INNER JOIN sys.tables tp ON fk.parent_object_id = tp.object_id
INNER JOIN sys.tables tr ON fk.referenced_object_id = tr.object_id
INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id
INNER JOIN sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
where tp.name='Payments' and cp.name = 'UserID'
我希望我能在 EF 中做到这一点
解决方案
想象一下这两个类:
public class User
{
public int Id {get; set;}
public string Name{ get;set;}
....
}
public class Payment
{
public int Id {get; set;}
public int UserId {get; set;}
....
}
现在 UserId 是一个外键:
如果您使用的是实体框架(DB First)并且类是自动生成的,那么:
一个。当在其后放置 a 时,每个都
User
将具有Payments
其子项.
:用户用户 = SomeQuery...
你有user.Payments
b.每次付款都有一个用户属性:
Payment payment = somequery...
您可以通过以下方式访问付款的用户payment.User
- 在您的项目中找到带有
.edmx
扩展名的文件。它显示了表格的图表。每个表都有一些字段,在字段的底部,有一个Navigation Properties
显示由于外键而可以访问的属性:
- 在您的项目中查找
.tt
文件。您可以从那里的数据库中找到自动生成的类。由于外键的所有字段,virtual
因为它们只是导航并且并不真正属于该表(基于一对一,一对多,......关系)它们可以是虚拟的东西,或虚拟 ICollecion。
编辑:
如您在评论中所述,要检查字段是否是运行时中的外键,您必须使用反射。看看这个答案。
推荐阅读
- ios - Objective-C - UIAlertView 不委托
- android - 错误:任务“:app:transformDexWithInstantRunSlicesApkForDebug”执行失败。无法读取 zip 文件
- jquery - jQuery Ajax GET 在 Web API 核心控制器中调用错误的方法
- elasticsearch - Elasticsearch 5.2.0 put normalizer 错误
- javascript - 是否可以让 Javascript 的 fetch() 等待响应,即使响应需要一个小时才能返回,而无需进行第二次请求尝试?
- node.js - 命名空间在节点 js 中的 soap 响应正文中未定义。
- c# - 按parentid对子记录进行分组并对linq C#的数量求和
- python - 二叉搜索树:如何在插入时定位“当前节点”
- c# - asp.net mvc 5中的自定义条带支付,动作控制器中带有可选参数
- ibm-cloud - 如何在沃森对话中从日期中提取日期