。当有关系时,包含始终为空

问题描述 投票:0回答:1
当我尝试使用 include 获取 Barcode 的底层值时,

我的对象

Pashouder
返回 null。当我删除包含内容时,我得到
Pashouder
,只是没有条形码。

var ph = _context.Pashouders.Include(p => p.Barcode).FirstOrDefault(p => p.Id == id);

ph
返回 null。当我删除
Include(p => p.Barcode)
时,我得到
Pashouder

型号:

public class Pashouder
{
    [Key]
    public int Id { get; set; }

    public int BarcodeId { get; set; }
    public virtual Barcode Barcode { get; set; }
}

public class Barcode
{
    [Key]
    public int Id { get; set; }

    public Guid Code { get; set; }

    [MaxLength(50)]
    public string Type { get; set; }
}

上面已经描述了一切。我该如何解决这个问题?

entity-framework-core core
1个回答
0
投票

正如评论中提到的,首先要消除的明显问题是条形码是可选的还是必需的。如果 Pashouder 可以在没有条形码的情况下存在,那么在 .Net Core 中,BarcodeID 和 Barcode 应该声明为可为空:

public int? BarcodeId { get; set; }
public Barcode? Barcode { get; set; }

如果预期的条形码行位于数据库中并且应该返回,那么一种可能的可能性是没有正确设置 FK 到条形码的映射。您需要确保关系配置为使用 BarcodeId 作为 FK:

builder.Entity<Pashouder>()
    .HasOne(x => x.Barcode)
    .WithOne()
    .HasForeignKey<Pashouder>(x=> x.BarcodeId);

默认情况下,一对一关系将使用两个表上的 PK,因此如果映射保留为:

,您可能会加载 Pashour ID=27 和 BarcodeID=10
builder.Entity<Pashouder>()
    .HasOne(x => x.Barcode)
    .WithOne();

然后 EF 将尝试将 Pashouder.Id 与 Barcode.Id 匹配,或者两者都匹配 27,而不是 Barcode.Id 的 #10。如果没有匹配的 ID,这最终可能不会返回任何内容,或者更糟糕的是,如果碰巧存在具有相同 ID 的条形码,则会返回错误的条形码。

验证这一点的一种方法是在数据库上启用探查器并捕获 EF 生成的 SQL 来加载两个实体,并且它应该概述正在使用的确切 SQL,该 SQL 可能具有不正确的连接。

要检查的另一件事是,在运行时,您实际上正在访问您期望的数据库中的数据,并且连接字符串没有指向具有不同的、不完整数据的旧数据库实例。

© www.soinside.com 2019 - 2024. All rights reserved.