3

私はEF/LINQが初めてで、検索してもこれを理解できないようです。私は既存のデータベースで作業しています。私には親がいて、子供と一対多の関係にあります。データベースを使用して、親のリストを作成し、その子を作成したいと考えています。最終的に、親のすべてのデータのコレクションが得られます。各データには、データが入力された子のリストがあります。しかし、親子関係がうまくいかないようです。私はこれを行う方法を知っています:

var query = (from p in myDbContext.Parents
              select p);

しかし、それは私に子データを与えません。私はこれを行う方法を考え出しました:

var query = (from p in myDbContext.Parents join c in myDbContext.Children
            on p.Id equals c.ParentId into gj
            from sub in gj.DefaultIfEmpty()
            select p);

しかし、左外部結合と同じように、複数の子を持つ親レコードが繰り返されます。それらをループして、必要なデータを少しずつ構築することもできますが、実際には関係に基づいた方法があると思いますか? 最終的には、多対多も処理する必要があります。私のモデルは次のとおりです。

public class Parent
{
    public int Id { get; set; } 
    public string Name { get; set; }
    public virtual ICollection<Child> Children { get; set; }

    /* and a bunch of other fields */

    public Parent()
    {
        this.Children = new List<Child>();
    }
}

public class Child
{
    public int Id { get; set; }
    public int ParentId { get; set; }        
    public string Name { get; set; }
}

私のマッピング:

public class ParentMap : EntityTypeConfiguration<Parent>
{
    public ParentMap()
    {
            this.HasKey(t => t.Id);

            HasMany(t => t.Children)
                .WithRequired()
                .HasForeignKey(t => t.ParentId);

            this.Property(t => t.Name)
                .HasMaxLength(50);

            this.ToTable("Parents");
            this.Property(t => t.Id).HasColumnName("ParentId");
            this.Property(t => t.Name).HasColumnName("Name");

            /* and a bunch of other properties */
        }


}

public class ChildMap : EntityTypeConfiguration<Child>
{
    public ChildMap()
    {
        this.HasKey(t => t.Id);
        this.Property(t => t.Name)
            .HasMaxLength(50);

        this.ToTable("Children");
        this.Property(t => t.Id).HasColumnName("ChildId");
        this.Property(t => t.ParentId).HasColumnName("ParentId");
        this.Property(t => t.Name).HasColumnName("Name");
    }

}

私のデータコンテキスト:

public class myContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }

    public myContext() :
        base("Name=myContext")
    {
        Configuration.ProxyCreationEnabled = false;
    }

    static myContext()
    {
        Database.SetInitializer<myContext>(null);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ParentMap());
        modelBuilder.Configurations.Add(new ChildMap());
    }        
}
4

1 に答える 1

2

私はあなたが探していると思います.Include()

次に、次のように記述できます。

var parents = myDbContext.Parents.Include(x => x.Children);

または :

var parents = (from p in myDbContext.Parents.Include(x => x.Children) 
               select p)

これで、子が親オブジェクトに含まれるようになります。

using System.Data.Entity;「 」を忘れずに追加してください

于 2013-10-14T05:21:16.880 に答える