gpt4 book ai didi

c# - Entity Framework 返回 null 子项,底层 SQL 没问题

转载 作者:太空宇宙 更新时间:2023-11-03 20:17:56 25 4
gpt4 key购买 nike

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

我有两个类,我们称它们为父类和子类。这是它们的设置方式:

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 行。

我遇到的问题是第一个结果确实包含子项列表,但第二个结果的列表为空。如果我在个人 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 将有 child 而 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 作为关键。

关于c# - Entity Framework 返回 null 子项,底层 SQL 没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15509042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com