【问题标题】:Nullable property raises validation error while it shouldnt可空属性会引发验证错误,但它不应该
【发布时间】:2015-05-08 15:58:00
【问题描述】:

将实体框架与 Breeze 结合使用,我有此类 Taxi 和可为空的 int TravelID:

public class Taxi
{
    // some primary key/Id stuff

    // Then these:
    public int? TravelID { get; set; }
    public virtual Travel Travel { get; set; }
}

(当然是简化的)映射如下所示:

public TaxiMap()
{
    this.Property(t => t.TravelID).IsOptional();
}

我的数据库工具 (HeidiSQL) 显示该属性可以为空,默认也是 NULL。但是当我尝试保存出租车实体时,我收到了这个验证错误:

errorMessage: "'TravelID' is required"

以前需要 TravelID,但我这样更改了它。 TravelID 为空时会发生此错误。当它为 0 时,我得到一个 FK 约束错误。

所以现在我的问题是,我是否忘记了任何事情/做错了什么来使可以为空的工作?

1 小时后添加:我现在找到了一种解决方法,但它真的很脏,我真的不想使用它。在前端,我将 TravelID 设置为“0”以通过验证,然后在我的控制器中,我在保存之前将 Taxi 的 TravelID 设置为 NULL。

【问题讨论】:

  • 当您提到实体框架作为标签时,您是否在更改 TravelID 现在是可选而不是强制之后更新了模型?
  • 你添加TaxMap到EF配置对象了吗?
  • Thomas 和 Jenish 都同意。
  • @Peter 您对问题的更新 我将出租车的 TravelID 设置为 NULL 没有任何意义,因为您在问题中提到了This error occurs when the TravelID is null...
  • @JenishRabadiya 问题是这确实有意义。当我尝试将实体保存在前端时 TravelID 为空时,我会收到上述验证错误。因此,为了通过验证,我在前端将其设置为 0,然后在后端将其更改为 null,否则后端会引发外键约束错误。 (但我完全理解你的困惑)

标签: c# entity-framework breeze


【解决方案1】:

TravelID 不是您的 Taxi 类的实际 ID,它是 Travel 类的外键。您尝试在此处进行的映射应该在 TravelMapper 中,因为它属于那里。

如果您将其带到下一步,您可以省略所有这些并在模型上使用属性,例如 ID 属性上方的自动生成属性:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }

这样可以确保 Travel 类必须有一个 ID,但在 Taxi 类中没有任何义务要求您指定 Travel 类型的对象。

【讨论】:

  • 虽然您的观察可能是有效的,但我认为它并不能真正回答我的问题。我有多个以相同方式映射的模型(最初不是由我而是由另一个在我之前从事这个项目的实习生)并且它们都可以正常工作。是的,我知道 TravelID 是外键。
  • 如果您知道 TravelID 是外键,为什么要将其映射为主键?如果将此特定映射器与其他映射器进行比较,它们是否有任何显着差异,例如关系(一对一,一对多,...)
  • 我有一个 Flight 类,除了某些特定属性外,它看起来完全一样,而且它的工作没有问题,这让我感到困惑。关于键,据我所知,T.Id 是主键,而 T.TravelID 是外键...为避免可能的混淆,我将从我的问题中删除 T.Id 部分。
猜你喜欢
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2014-05-19
  • 2015-05-21
相关资源
最近更新 更多