1

流暢な API とエンティティ フレームワーク (多対多の関係) に問題があります。データベースからデータを取得しようとすると、オブジェクト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);}

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


}
4

2 に答える 2

3

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 は 3 番目の結合テーブルを作成します。ClassificationCompaniesこれは、両方のテーブルの PK で構成されます。ClassificationId& CompanyId.

ジャンクション テーブルの名前と FK 列を指定する必要がある場合は、OnModelCreatingFluent 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");
                        });

}

もう 1 つの方法は、ジャンクション テーブルを表すエンティティを作成し (やろうとしているように)、 と を使用して 2 つの 1 対多の関係を確立する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);}
于 2015-04-12T13:15:59.147 に答える
2

値を取得するために使用しているクエリを表示できますか? オブジェクトが遅延ロードされていることに関連すると思います。ナビゲーション プロパティを要求する前に ToList() を実行すると、これらの値は null になります。これをクエリに追加して、値を強制的に含める必要があります。

.Include(x => x.Company)

必要なオブジェクトごとに、またはオブジェクトがまだ生きている間に値を要求するなどです。つまり、ToList(); を実行する前に。ここで詳しく説明します: https://msdn.microsoft.com/en-gb/library/vstudio/bb738633%28v=vs.100%29.aspx

以下のコメントに基づいて、 FirstOrDefault() はクエリを実行するため、この時点以降はナビゲーション プロパティを入力できなくなります。私はこれを試してみます(dbContext.companyが一連のCompanyオブジェクトであることを提供します):

System.Data.Entity; の使用を追加します。

public Company getCompany(int id) { 
    Company data = dbContext.company.Include(x => x.companyPkdClassification .Select(y => y.company)).Include(x => x.companyPkdClassification .Select(y => y.pkdClassification)).Where(i => i.id == id).FirstOrDefault();
    return data; 
}
于 2015-04-12T12:27:52.543 に答える