从数据库检索数据时,我遇到了一个奇怪的问题。这是一个从.NET Core 1.0升级到.NET Core 2.1的项目。一切都在进行中,但是升级在加载相关数据时会有一些奇怪的副作用。所使用的确切版本是.NETCore.app的2.1。对于AspNetCore 2.1.4,对于EntityFrameworkCore(.Sqlite)2.1.4。
可以使用以下模型来表达该问题。插入后,首先添加一个Match
,而没有相关的Result
实体。然后,创建每个Result
,最后使用这些实例再次更新Match
。这就是Match
中ID字段为空的原因。
public class Result
{
public int Id { get; set; }
public int MatchId { get; set; }
public Match Match { get; set; }
}
public class Match
{
public int Id { get; set; }
public int? HomeId { get; set; }
public int? AwayId { get; set; }
public Result Home { get; set; }
public Result Away { get; set; }
}
当我检索数据(例如context.Results.Include(r => r.Match)
)并检查结果时,会发生什么情况,每个其他结果都丢失了相关数据。这些表似乎只会发生这种情况,因此由于模型的双向性,我的猜测有些误入歧途。
检查器显示如下结果。应该注意的是,两个连续结果的集合总是指向相同的Match
。
results
- [0]
Id = 1000
Match = Null
- [1]
Id = 1001
Match = <Match object>
- [2]
Id = 1002
Match = Null
- [3]
Id = 1003
Match = <Match object>
以此类推。我也很难在这些表中插入数据(弹出类似的问题),但现在让我们将其排除在此问题的范围之外。
答案 0 :(得分:0)
要回答我自己的问题:问题出在关系映射中。有several related questions恰好与我的匹配,但通常建议是创建其他字段以更好地描述映射。由于不希望更改数据库架构,因此这不是一个选择。
请注意,此问题与SQLite无关。然而,奇怪的是,事情按照问题中的描述工作。我没有调查造成这种情况的原因,但是看起来好像SQLite二进制文件的Entity Framework处理这种情况的方式都不一样。并不是说这是一个错误,而是由于版本之间的主要区别使得它可能至少与此有关。
也就是说,解决方案。 ModelBuilder
最初具有以下定义:
modelBuilder.Entity<Match>()
.HasOne(m => m.Home)
.WithMany()
.HasForeignKey(m => m.HomeId);
modelBuilder.Entity<Match>()
.HasOne(m => m.Away)
.WithMany()
.HasForeignKey(m => m.AwayId);
modelBuilder.Entity<Result>()
.HasOne(r => r.Match)
.WithOne()
.HasForeignKey<Result>(r => r.MatchId);
与此相关的一个问题是,来自WithMany
的{{1}}映射不正确。将其更改为Match
-尽管更正确-对此问题没有影响。通过删除从WithOne
到Result
的关系映射来解决此问题。显然,这默默地映射了反向关系,选择了两个关系向Match
之一。由于(我假设)一旦指定了一端,实体框架就会处理反向关系,因此可以(应该)省掉它来修复问题并保留所有导航。
为完整起见,最终的Result
定义:
ModelBuilder