首页 > 解决方案 > 如何知道列是否在实体框架中具有外键

问题描述

我是实体框架的新手,

要更新单元格值,如果当前字段与另一个 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 中做到这一点

标签: c#sqlentity-frameworkforeign-keysentity

解决方案


想象一下这两个类:

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 是一个外键:

  1. 如果您使用的是实体框架(DB First)并且类是自动生成的,那么:

    一个。当在其后放置 a 时,每个都User将具有Payments其子项.

    用户用户 = SomeQuery...

你有user.Payments

b.每次付款都有一个用户属性:

Payment payment = somequery...

您可以通过以下方式访问付款的用户payment.User

  1. 在您的项目中找到带有.edmx扩展名的文件。它显示了表格的图表。每个表都有一些字段,在字段的底部,有一个Navigation Properties显示由于外键而可以访问的属性:

在此处输入图像描述

  1. 在您的项目中查找.tt文件。您可以从那里的数据库中找到自动生成的类。由于外键的所有字段,virtual因为它们只是导航并且并不真正属于该表(基于一对一,一对多,......关系)它们可以是虚拟的东西,或虚拟 ICollecion。

编辑:

如您在评论中所述,要检查字段是否是运行时中的外键,您必须使用反射。看看这个答案


推荐阅读