【问题标题】:EF Core fail to load entity with nullable string valueEF Core 无法加载具有可为空字符串值的实体
【发布时间】:2021-08-14 00:43:39
【问题描述】:

我在从数据库中检索任何具有空字符串值的记录时遇到问题。我正在使用 SQL Server 2012、.NET 5.0。

我的模型课:

public class Project
{
    public int ProjectId { get; set; }

    [StringLength(50)]
    public string ProjectSaleTypeId { get; set; }

    [JsonIgnore]
    public ProjectSaleType ProjectSaleType { get; set; }
}

public class ProjectSaleType
{

    [StringLength(50)]
    public string ProjectSaleTypeId { get; set; }

    [JsonIgnore]
    public ICollection<Project> Projects { get; set; }
}

然后当我请求获取id为365的实体时:

_context.Projects.FirstOrDefault(x => x.ProjectId == 365);

出现以下错误:

System.InvalidOperationException: '读取属性 'Project.ProjectSaleTypeId' 的数据库值时发生错误。预期类型为“System.String”,但实际值为 null。'

需要注意的是,具有ProjectSaleTypeId 的实体工作正常。

我了解 C# 8.0 引入了可为空的引用类型。但是我没有在我的项目中启用这些; https://docs.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types

为什么在检索 ProjectSaleTypeId 等于 null 的实体时会出现此错误?

【问题讨论】:

  • 您的映射是如何完成的?任何添加的约定?
  • 我没有在OnModelCreating 期间使用模型构建器为Project 配置映射
  • ProjectSaleTypeId 是fk吗?
  • 是的,ProjectSaleTypeId 是一个可以为空的外键。
  • 你试过在OnModelCreating中强制它吗? modelBuilder.Entity&lt;Project&gt;().Property(m =&gt; m.ProjectSaleTypeId).IsOptional();

标签: c# entity-framework entity-framework-core


【解决方案1】:

此错误意味着 ProjectSaleTypeId 是不可为空的字符串属性,但您的数据库表允许该列的 NULL 值。

如果 EF 正在处理您的数据库,则不应该发生这种情况,但您可能会意外更改 DB 列类型并且未正确迁移。

【讨论】:

  • 我没有使用迁移。我需要以某种方式向 EF 表明这一点吗?还; ProjectSaleTypeId 是数据库中可以为空的 varchar(50)。我的理解是我的数据模型允许使用 string 为空值,因为我没有打开可空引用类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2023-02-04
  • 2019-05-13
  • 2016-10-02
  • 1970-01-01
  • 2020-09-19
  • 2021-02-16
相关资源
最近更新 更多