我对流畅的 api 和 Entity Framework (多对多关系)有疑问。当我尝试从数据库中获取数据时,对象 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);}
pkdClassification
public class PkdClassification
{
[Key]
[DisplayName("Id")]
public int id { get; set; }
...
public virtual ICollection<CompanyPkdClassification> companyPkdClassification { get; set; }
}
companyPkdClassification
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 列,那么您可以在上下文中配置覆盖 OnModelCreating
方法的关系并使用 Fluent Api:
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/