我对流畅的api和实体框架(很多对很多的关系)有疑问。当我尝试从数据库获取数据时,对象Company
和pkdClassification
的值为空。值CompanyId
和PkdClassyficationId
正确返回。
语境
//in contrstructor set
// this.Configuration.LazyLoadingEnabled = true;
.Entity<CompanyPkdClassification>()
(c => new { c.PkdClassyficationId, c.CompanyId });
modelBuilder.Entity<Company>()
.HasMany(c => c.companyPkdClassification)
.WithRequired()
.HasForeignKey(c => c.CompanyId);
modelBuilder.Entity<PkdClassification>()
.HasMany(c => c.companyPkdClassification)
.WithRequired()
.HasForeignKey(c => c.PkdClassyficationId);}
pkd分类
public class PkdClassification
{
[Key]
[DisplayName("Id")]
public int id { get; set; }
...
public virtual ICollection<CompanyPkdClassification> companyPkdClassification { get; set; }
}
companyPkd分类
public class CompanyPkdClassification
{
[ForeignKey("company")]
public int CompanyId { get; set; }
[ForeignKey("pkdClassification")]
public int PkdClassyficationId { get; set; }
public virtual ICollection<Company> company { get; set; }
public virtual ICollection<PkdClassification> pkdClassification { get; set; }
}
最后一家公司
public class Company : baseModel
{
...
virtual ICollection<CompanyPkdClassification> companyPkdClassification { get; set; }
}
最佳答案
在Code First中映射多对多关系的最佳方法是:
public class Classification
{
[Key]
[DisplayName("Id")]
public int id { get; set; }
...
public virtual ICollection<Company> Companies{ get; set; }
}
public class Company
{
public int Id { get; set; }
...
public virtual ICollection<Classification> Classifications { get; set; }
}
默认情况下,Code-First将创建第三个联接表
ClassificationCompanies
,它将由两个表的PK组成。 ClassificationId
和CompanyId
。如果需要指定联结表和FK列的名称,则可以使用Fluent Api在上下文中配置覆盖
OnModelCreating
方法的关系:protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Classification>()
.HasMany<Company>(s => s.Companies)
.WithMany(c => c.Classifications)
.Map(cs =>
{
cs.MapLeftKey("ClassificationId");
cs.MapRightKey("CompanyId");
cs.ToTable("ClassificationCourses");
});
}
另一种方法是创建一个表示联结表的实体(如您尝试做的那样),并使用
Classification
和Company
稳定两个一对多关系,但是如果您不需要向联结添加额外的列表,建议使用第一个变体。如果遵循此变体,则表示联结表的实体将如下所示:public class CompanyPkdClassification
{
public int CompanyId { get; set; }
public int PkdClassyficationId { get; set; }
public virtual Company Company { get; set; }
public virtual Classification Classification { get; set; }
}
并配置:
modelBuilder.Entity<CompanyPkdClassification>().HasKey(c => new { c.PkdClassyficationId, c.CompanyId });
modelBuilder.Entity<Company>()
.HasMany(c => c.companyPkdClassification)
.WithRequired(cc=>Company)
.HasForeignKey(c => c.CompanyId);
modelBuilder.Entity<PkdClassification>()
.HasMany(c => c.companyPkdClassification)
.WithRequired(cc=>Classification)
.HasForeignKey(c => c.PkdClassyficationId);}
关于c# - Entity Framework 代码首先多对多返回对象null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29589341/