如何在实体框架中知道列是否具有外键

时间:2018-08-02 09:31:33

标签: c# sql entity-framework foreign-keys entity

我是实体框架的新手,

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

1 个答案:

答案 0 :(得分:0)

想象一下这两个类:

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. 如果您使用的是实体框架(数据库优先),并且类是自动生成的,则:

    a。将每个User放在其后的Payments都将.作为其子项:

    用户user = SomeQuery ...

您有user.Payments

b。每次付款都具有用户属性:

Payment payment = somequery...

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

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

enter image description here

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

编辑:

要按照注释中的说明检查运行时字段是否为外键,必须使用Reflection。 check out this answer