我目前正在使用连接到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
视为密钥。关于c# - Entity Framework 返回空子代,基础SQL很好,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15509042/