【问题标题】:Expose Foreign key through fluent API通过 fluent API 公开外键
【发布时间】:2015-08-25 14:46:59
【问题描述】:

好的,所以我有很多对象,但假设它只有 2 个对象,Company 和 People,为了简单的示例,我已经剪掉了大部分道具:

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();
}}

似乎效果很好,人们在db中获得了公司的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 公开它的外键,所以我不能像这样加入它们。

所以我的问题是,我可以将创建 fk 的流利 api 公开给我的对象模型,以便我可以 linq 吗?

或者我应该使用 lambda 一个,并以某种方式将其映射到我的视图模型,这样它就不会为此视图生成不需要的列?

【问题讨论】:

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


    【解决方案1】:

    首先,将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 类并以这种方式修改该配置(同时映射 People 表中具有该 FK 列的同名 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
               //...
    

    【讨论】:

    • 我要强调的是,当这些导航到位时,不需要加入。
    • 是的,也许 OP 还不知道如何使用它们,因此它正在尝试将 sql 查询转换为 linq 查询。这个article 可以帮助 OP 更好地理解如何使用导航属性。
    • Yapp 我不知道这个,对 EF 来说很新。感谢您的宝贵意见!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多