【问题标题】:Entity Framework, LINQ, and populating parent models and their children实体框架、LINQ 和填充父模型及其子模型
【发布时间】:2013-10-14 04:40:32
【问题描述】:

我是 EF/LINQ 的新手,尽管进行了搜索,但我似乎无法弄清楚这一点。我正在使用现有的数据库。我有父母,他们与孩子是一对多的关系。我想使用数据库来填充父母的列表 AND 填充他们的孩子。所以最后我将为父母收集所有数据,每个父母都有一个孩子列表,其中也填充了数据。但我似乎无法让亲子关系发挥作用。我知道该怎么做:

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

但这并没有给我 Child 数据。我想出了如何做到这一点:

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

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    我猜你在找.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;

    【讨论】:

    • 这两项工作,谢谢! (非常感谢您将 using 包含在您的答案中 - 它为我节省了更多搜索时间。)
    • 我在开始使用 EF 时遇到了同样的问题,我花了一段时间才找到命名空间。很高兴我能帮忙:)
    猜你喜欢
    • 2019-03-07
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2011-08-29
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多