2016-10-28 2 views
1

私は既存の2つのテーブルの間に多対多の関係を導入しました。このために、私は他の2つのテーブルのIDだけを含む第3のテーブルを追加しました。エンティティフレームワーク多対多 - データを取得できません

私はEFを使用しておりますので、私はまたEntityOneにEntityTwo

public virtual List<EntityOne> EntityOnes

public virtual List<EntityTwo> EntityTwosを追加しました。

しかし、これで、EntityTwoオブジェクトを取得すると、関連するEntityOneオブジェクトは含まれません。テーブルにデータがあるにもかかわらず、リストのカウントはゼロです。

ここに何か不足していますか?私は何かする必要がありますか?


わからない、これが関連しているが、私はこれを試してみてくださいOnModelCreation

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<EntityOne>(). 
       HasMany(p => p.EntityTwos). 
       WithMany(a => a.EntityOnes). 
       Map(
           m => 
           { 
            m.MapLeftKey("EntityTwoId"); 
            m.MapRightKey("EntityOneId"); 
            m.ToTable("EntityRelations"); 
           }); 
      ////Make sure a context is not created by default. 
     } 
+1

あなたは遅延ロードが有効になっていますか?その場合は、関連するテーブルデータを含めるためにクエリで.Include( "EntityName")を実行する必要があります。 https://msdn.microsoft.com/en-us/data/jj574232(v=vs.113).aspx – AllMadHare

+0

関連するデータを取得する予定のコードを表示してください。それがなければ、あなたがしたことだけを推測することができます。 –

答えて

0

にも、この持っている場合:

public partial class One 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual int Id { get; set; } 

    private ICollection<OneTwo> _oneTwos; 
    public virtual ICollection<OneTwo> OneTwos 
    { 
     get { return _oneTwos ?? (_oneTwos = new List<OneTwo>()); } 
     set { _oneTwos = value; } 
    } 
} 

public partial class Two 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual int Id { get; set; } 

    private ICollection<OneTwo> _oneTwos; 
    public virtual ICollection<OneTwo> OneTwos 
    { 
     get { return _oneTwos ?? (_oneTwos = new List<OneTwo>()); } 
     set { _oneTwos = value; } 
    } 
} 

が参加するクラスにナビゲーションプロパティを追加します。

public partial class OneTwo 
{ 
    public virtual int OneId { get; set; } 
    public virtual int TwoId { get; set; } 

    public virtual One One { get; set; } 
    public virtual Two Two { get; set; } 
} 

複合キーをクラスに参加し、関係を設定します。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<OneTwo>() // composite primary key 
       .HasKey(p => new { p.OneId, p.TwoId }); 
    modelBuilder.Entity<OneTwo>() 
       .HasRequired(a => a.One) 
       .WithMany(c => c.OneTwos) 
       .HasForeignKey(fk => fk.OneId) 
       .WillCascadeOnDelete(false); 
    modelBuilder.Entity<OneTwo>() 
       .HasRequired(a => a.Two) 
       .WithMany(c => c.OneTwos) 
       .HasForeignKey(fk => fk.TwoId) 
       .WillCascadeOnDelete(false); 
    // TODO: handle orphans when last asociation is deleted 
} 

代替戦略はEntityTypeConfiguration <経由EF関係を設定することです>。

City.cs

public partial class City 
{ 
    public virtual int Id { get; set; } 

    private ICollection<CountyCity> _countiesCities; 
    public virtual ICollection<CountyCity> CountiesCities 
    { 
     get { return _countiesCities ?? (_countiesCities = new List<CountyCity>()); } 
     set { _countiesCities = value; } 
    } 
} 

County.cs

public partial class County 
{ 
    public virtual int Id { get; set; } 

    private ICollection<CountyCity> _countiesCities; 
    public virtual ICollection<CountyCity> CountiesCities 
    { 
     get { return _countiesCities ?? (_countiesCities = new List<CountyCity>()); } 
     set { _countiesCities = value; } 
    } 
} 

CountyCity.cs

public partial class CountyCity 
{ 
    public virtual int CountyId { get; set; } 
    public virtual int CityId { get; set; } 

    public virtual County County { get; set; } 
    public virtual City City { get; set; } 
} 

CountyCityConfiguration.cs:以下の多対多の関係の実装は、そのアプローチを実証します(EF6実装)

public class CountyCityConfiguration : IEntityTypeConfiguration<CountyCity> 
{ 
    public void Map(EntityTypeBuilder<CountyCity> builder) 
    { 
     // Table and Schema Name declarations are optional 
     //ToTable("CountyCity", "dbo"); 

     // composite primary key 
     builder.HasKey(p => new { p.CountyId, p.CityId }); 

     builder.HasOne(pt => pt.County) 
       .WithMany(p => p.CountiesCities) 
       .HasForeignKey(pt => pt.CountyId) 
       .OnDelete(DeleteBehavior.Restrict); 

     builder.HasOne(pt => pt.City) 
       .WithMany(t => t.CountiesCities) 
       .HasForeignKey(pt => pt.CityId) 
       .OnDelete(DeleteBehavior.Restrict); 

     // TODO: handle orphans when last association is deleted 
    } 
} 

Entity Frameworkの6つの実装:

前のコードが示すようにあなたはEntityTypeConfiguration <>を使用して複合キーとの関係を設定することができます。

Entity Frameworkのコアの実装:

EntityTypeConfiguration <>まだ移行されていません。しかし、それは次のリリースのロードマップにあります。

一方、temporary pattern suggested by the EF team、またはこれよりもむしろlengthy StackOverflow post discussing entity configuration in Entity Framework 7のいずれかのパターンを使用できます。

EFチームの記事を読む前に、長いコラボレーションでCocowallaが投稿したパターンを実装しました。 source code for my workaround is available in this GitHub repository。ここで

IEntityTypeConfiguration.cs

namespace Dna.NetCore.Core.DAL.EFCore.Configuration.Temporary.Cocowalla 
{ 
    // attribute: https://stackoverflow.com/questions/26957519/ef-7-mapping-entitytypeconfiguration/35373237#35373237 
    public interface IEntityTypeConfiguration<TEntityType> where TEntityType : class 
    { 
     void Map(EntityTypeBuilder<TEntityType> builder); 
    } 
} 

そのパターンの私の実装です:

namespace Dna.NetCore.Core.DAL.EFCore.Configuration.Common 
{ 
    public class StateOrProvinceConfiguration : IEntityTypeConfiguration<StateOrProvince> 
    { 
     public void Map(EntityTypeBuilder<StateOrProvince> builder) 
     { 
      // EF Core 
      builder.HasOne(p => p.Country).WithMany(p => p.StateOrProvinces).HasForeignKey(s => s.CountryId).OnDelete(DeleteBehavior.Cascade); 
      builder.HasMany(d => d.Cities).WithOne().OnDelete(DeleteBehavior.Cascade); 
      builder.HasMany(d => d.Counties).WithOne().OnDelete(DeleteBehavior.Cascade); 
     } 
    } 
} 
関連する問題