繁体   English   中英

实体框架返回空子代,基础SQL很好

[英]Entity Framework returning null children, underlying SQL is fine

我目前正在使用连接到Pervasive数据库的Entity Framework遇到空子值的奇怪问题。 我是新手,所以我的术语可能是错误的。

我有两个班,我们将其称为“父母和孩子”。 这是它们的设置方式:

public class Parent
{        
    public int ParentUK { get; set; }
    public int ParentName { get; set; }
    public int Status { get; set; }
    public virtual IList<Child> Children { get; set; }
}

带有映射文件

public class Parent_Map : SchemaNameEntityTypeConfiguration<Parent>
{
    public Parent_Map(string schemaName)
        : base(schemaName)
    {
        ToTable("Parent");
        HasKey(p => p.ParentUK);

        Property(p => p.ParentUK)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        Property(p => p.ParentName)
            .IsRequired();

        Property(p => p.Status)
            .IsRequired();

        HasMany(p => p.Children)
            .WithRequired()
            .HasForeignKey(c => c.ParentUK);
    }
}

和儿童班

public class Child
{
    public int ParentUK { get; set; }        
    public int Sequence { get; set; }
    public int ChildName { get; set; }
}

对应:

public class Child_Map : SchemaNameEntityTypeConfiguration<Child>
{
    public Child_Map(string schemaName)
        : base(schemaName)
    {
        ToTable("Child");

        HasKey(t => t.ParentUK);
        HasKey(t => t.Sequence);

        Property(t => t.ParentUK)
             .IsRequired();

        Property(t => t.Sequence)
             .IsRequired();

        Property(t => t.ChildName)
             .IsRequired();

     }
}

当我运行以下查询时,我希望得到一个包含2个父母(每个孩子3个孩子)的列表。

var result = context.Parents
     .Include(p => p.Children)
     .Where(p => p.ParentUK < 3);


foreach (var thing in result)
{
     if (thing.Children != null)
     {
          Console.WriteLine(thing.ParentName+ "  has some children " + thing.Children.Count);
     } 
     else
     {
          Console.WriteLine(thing.ParentName+ "  has NO children ");
     }
}

我已验证基础SQL包括两个表之间的联接并返回6行。

我正在努力解决的问题是,第一个结果确实包含一个子列表,但是第二个结果的列表为null。 如果我在查询单个ID之后运行查询,则一切正常,因此我不知道映射是否有问题。

如果我以更多结果运行查询,它将类似于

P1  has some children 3
P2  has NO children
P3  has NO children
P4  has NO children
P5  has some children 3
P6  has NO children
P7  has NO children
P8  has NO children

如果我以延迟加载的方式运行查询,则会得到类似的结果,但P7将具有子项,而P5将不会。

这是一个通用示例,但应该可以说明我的问题。 我真的不确定EF为什么要努力填充列表。 它不会引发任何异常,但是我不确定它是否静默地记录在某处。

尝试更换...

HasKey(t => t.ParentUK);
HasKey(t => t.Sequence);

...通过...

HasKey(t => new { t.ParentUK, t.Sequence });

...这是定义组合键的正确方法。 在原始映射中, HasKey(t => t.Sequence)覆盖HasKey(t => t.ParentUK)因此EF仅将Sequence视为键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM