【问题标题】:System.InvalidOperationException: The property 'x.y' is of type 'x' which is not supported by the current database providerSystem.InvalidOperationException:属性“x.y”属于“x”类型,当前数据库提供程序不支持
【发布时间】:2022-01-04 00:16:01
【问题描述】:

我之前使用数据注释验证,现在我想更改 Fluent Validation。 因为现在我们将项目更改为干净的架构。

当我从邮递员发送数据时,请求进入异常。

System.InvalidOperationException:属性“X.Overview”属于“XOverview”类型,当前数据库提供程序不支持。更改属性 CLR 类型,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略该属性。

使用数据注解验证时

域 X.cs

public class X
{
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        public XOverview Overview { get; set; }
}
 public class XOverview
    {
        [Required]
        public int Id { get; set; }

        [Required]
        public string Content { get; set; }
}

在 DbConext.cs 中

public DbSet<XOverview> XOverview { get; set; }
// removed the rest

以上工作正常。

现在我想改成 fluent 验证。

使用流畅验证时

域 X.cs

public class X
{
        public XOverview Overview { get; set; }
}
 public class XOverview
{
        public int Id { get; set; }
        public string Content { get; set; }
}

// X 的流利验证

public class XConfiguration : IEntityTypeConfiguration<x>
{
   public void Configure(EntityTypeBuilder<x> builder)
    {
        builder.HasKey(i => i.Id);

        builder.Property(i =>i.Overview)
                .IsRequired();
    }
}

public class XOverviewConfiguration : IEntityTypeConfiguration<XOverview>
{
    public void Configure(EntityTypeBuilder<XOverview> builder)
    {
         builder.Property(i =>i.Id)
                .IsRequired();

        builder.Property(i =>i.Content)
                .IsRequired();
     
    }
}

更改为流利验证时我犯了什么错误? 请帮助查找问题。

【问题讨论】:

  • 错误出现在哪里?你可以调试它。根据这篇文章:github.com/dotnet/efcore/issues/24037
  • 当我在调试控制台中从邮递员发送请求时出现错误。你的建议是一对多的关系。我的是一对一的关系。 XOverview 是另一个表。创建新X时,会自动生成一个新的XOverview

标签: c# entity-framework-core


【解决方案1】:

首先,这不是“流式验证”,而是EF Core实体模型流式配置。

其次,具体问题是这一行

builder.Property(i =>i.Overview)

这是因为根据 EF Core 术语,Overview 不是属性,而是 导航属性(或简单的导航),因此在称为 Property(...) 的方法中是不允许的。相反,它只能用于关系配置方法(Has{One|Many}(...)/With({One|Many}(...))或 EF Core 5.0 引入的Navigation(...)

所以基本上你需要的是用Navigation替换Property,例如

builder.Navigation(i => i.Overview)
    .IsRequired();

【讨论】:

  • 嗨,伊万,谢谢
  • 但我有一个疑问。 XOverview 是另一个表。 ToTable() 和 Navigation() 方法一样吗?
  • 他们不是。 ToTable 正在配置实体的关联表。对于XOverview,它应该在XOverviewConfiguration 内。当Navigation 正在配置关系时,从包含导航的一侧(我猜你知道每个关系都有两个方面)。在这种情况下,您正在配置从XXOverview 的关系。有关详细信息,请参阅官方 EF Core 文档中的 Relationships 主题)。
猜你喜欢
  • 1970-01-01
  • 2023-01-15
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多