通过流畅的API公开外键

时间:2015-08-25 14:46:59

标签: c# linq entity-framework foreign-keys ef-fluent-api

好的,所以我有很多对象,但是举个例子说它只是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,所以它不会为此视图生成不需要的列?

1 个答案:

答案 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
           //...