好的,所以我有很多对象,但是举个例子说它只是2个对象,公司和人物,我已经删除了大部分道具的例子:
public class Company {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public List<People> Peoples { get; set; }
[StringLength(100)]
[Required]
public string Bname { get; set; }
}
和
public class People {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string FName { get; set; }
[StringLength(50)]
public string LName { get; set; }
[StringLength(50)]
}
我不想使用数据注释,因此我可以将我的地图分开并保持原位。 我的简化映射是:
class CompanyMap : EntityTypeConfiguration<Company> {
public CompanyMap() {
HasMany(p => p.Peoples)
.WithRequired();
}}
它似乎运行良好,人们在数据库中获得了fk,EF可以插入和撤回数据,如果我使用lambda,我可以查询它:
var tmp = db.Companies.Include("Peoples")
但如果我尝试用linq查询它,并加入它们:
var tmp2 = from c in db.Companies
join p in db.Person
on c.Id equals p.
正确的是我的问题,People对象没有从db中暴露它的外键,所以我无法像这样加入它们。
所以我的问题是,我可以将流畅的api创建的fk暴露给我的对象模式,所以我可以使用它吗?
或者我应该使用lambda,并以某种方式将其映射到我的viewmodel,所以它不会为此视图生成不需要的列?
答案 0 :(得分:2)
首先,将 FK属性(CompanyId
)和导航属性(Company
)添加到People
实体:
public class People {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
//...
public int CompanyId {get;set}
public virtual Company Company{get;set;}
}
然后,将Fluent Api关系配置移动到PeopleMap
类并以这种方式修改该配置(还要映射FK属性,其名称与People
表中具有该FK列的名称相同):
public class PeopleMap : EntityTypeConfiguration<People> {
public CompanyMap() {
Property(p => p.CompanyId)
.HasColumnName("CompanyId");//remember change the name for the real FK column
HasRequired(p=>p.Company)
.WithMany(c=>c.Peoples)
.HasForeignKey(p=>p.CompanyId);
}
}
之后,您应该可以在查询中使用CompanyId
FK属性:
var tmp2 = from c in db.Companies
join p in db.Person on c.Id equals p.CompanyId
//...