私は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());
}
}