c# - Entity Framework 代码首先多对多返回对象 null

标签 c# asp.net-mvc entity-framework many-to-many ef-fluent-api

我对流畅的 api 和 Entity Framework (多对多关系)有疑问。当我尝试从数据库中获取数据时,对象 CompanypkdClassification 具有空值。值 CompanyIdPkdClassyficationId 正确返回。

上下文

 //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,即。 ClassificationIdCompanyId

如果您需要指定联结表的名称和 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");
                        });

}

另一种方法是创建一个表示联结表的实体(正如您尝试做的那样)并与 ClassificationCompany 建立两个一对多关系,但是如果您不需要向联结表添加额外的列,建议使用第一种变体。如果您遵循此变体,表示联结表的实体将如下所示:

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/

相关文章:

c# - TaskCompletionSource 无法处理多个等待的任务 - 我做错了什么?

使用 EF6 Code First 的 MySQL 现有数据库 - 使用脚手架创建 Controller 导致错误

c# - ASP.NET MVC 5 应用程序构建起来真的很慢

c# - 如何通过 'ESC' 按键导航到之前访问过的页面。 ASP.NET MVC(C#)

c# - 使用 Entity Framework 分组

c# - 是否可以访问中间件中生成的数据?

c# - 确保 C# 中的多播委托(delegate)执行列表顺序?

c# - 解析非标准 JSON

c# - LINQ to Entities 不支持 LINQ 表达式节点类型 'ArrayIndex'

asp.net-mvc - ALTER TABLE DROP COLUMN 失败,因为表 'xxx' 中不存在列 'yyy'