我有以下两个实体,
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匹配的所有应用程序。
答案 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.CollegueId
或App.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();