实体框架 - 如何访问模型中未列出的外键

时间:2015-02-04 15:38:21

标签: c# entity-framework model-view-controller foreign-keys

我有以下两个实体,

public class App
{
public int AppID { get; set; }
public string Business { get; set; }
public string ApName { get; set; }
public string FirstContact { get; set; }
}


public class Colleague
{
public int ColleagueID { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public string EmailAddress { get; set; }
public int PhoneNumber { get; set; }

public virtual ICollection<App> Apps { get; set; }
}

在我的SQL表中,这会自动为App模型创建一个引用ColleagueID的foriegn键属性。

我的问题是,由于在实际模型中没有提到foriegn键,我如何在查询中使用它?例如,我想显示外键与给定同事ID匹配的所有应用程序。

3 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。您需要填充App类的外键。这是一对多关系的完美例子。

public class App
{
    public int AppID { get; set; }
    public string Business { get; set; }
    public string ApName { get; set; }
    public string FirstContact { get; set; }

    [ForeignKey("Colleague")]
    public int ColleagueId { get; set; }
    public virtual Colleague Colleague { get; set; }
}

然后,您可以随时随地拨打App.CollegueIdApp.Colleague.CollegueId

答案 1 :(得分:0)

一个解决方案是:

IQueryable<Apps> q = ctx.Colleagues.Where(x => x.ColleagueID == someId).
    SelectMany(x => x.Apps);

您将不会在生成的SQL查询中看到支持Colleague的表。你会得到类似的东西:

SELECT
    [Extend1].[AppID] AS [AppID],
    ...
FROM [dbo].[Apps] AS [Extend1]
WHERE 123 = [Extend1].[Colleague_ColleagueID]

其中Colleague_ColleagueID由EF处理且仅由EF

处理

因此,基于您提供的理由,您无需在班级中公开FK。

答案 2 :(得分:0)

此外,如果您不想使用Data Annotations并希望Colleague在将App保存到数据库时是可选的,则可以使用Fluent Api。首先,将ColleagueId FK属性添加到App类:

public class App
{
  //...
  public int? ColleagueId { get; set; }
}

然后覆盖上下文中的OnModelCreating方法:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
        modelBuilder.Entity<App>()
            .HasOptional(a => a.Colleague)
            .WithMany(c => c.Apps)
            .HasForeignKey(a => a.ColleagueId);
 }

现在,您可以通过这种方式执行此查询:

int selectedColleagueId = 1;
var apps=context.Apps.Where(a => a.ColleagueId == selectedColleagueId);

但是,正如@ tschmit007在他的回答中所示,如果您只想搜索该值,则不需要公开FK。当您需要更新关系时,FK属性非常有用,例如,当您在内存中没有Coleague对象时,但您确实可以访问该对象的键值。使用外键属性,您只需使用键值而不依赖于在内存中具有该实例:

app.ColleagueId=3;
context.SaveChanges();