实体框架核心:SQLite的所有其他结果都缺少相关数据

时间:2018-10-22 08:36:41

标签: sqlite asp.net-core ef-core-2.1

从数据库检索数据时,我遇到了一个奇怪的问题。这是一个从.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>

以此类推。我也很难在这些表中插入数据(弹出类似的问题),但现在让我们将其排除在此问题的范围之外。

1 个答案:

答案 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-尽管更正确-对此问题没有影响。通过删除从WithOneResult的关系映射来解决此问题。显然,这默默地映射了反向关系,选择了两个关系向Match之一。由于(我假设)一旦指定了一端,实体框架就会处理反向关系,因此可以(应该)省掉它来修复问题并保留所有导航。

为完整起见,最终的Result定义:

ModelBuilder