【问题标题】:.Net Core 2.0 Foreign Key defaulting to 0.Net Core 2.0 外键默认为 0
【发布时间】:2018-03-29 06:01:01
【问题描述】:

我有一个相当基本的模型,用于在 Visual Studio 2017 中使用 .Net Core 2.0 开发的项目。模型匹配如下

public class QuoteModel : BaseModel{
   public QuoteModel()
   {
      GetQuoteItems = new List<QuoteItemModel>();
   }

   [Required]
   public int QuoteTypeID { get;set; }

   [Required]
   [ForeignKey("QuoteTypeID")]
   public QuoteTypeModel QuoteType { get;set;}

   public ICollection<QuoteItemModel> GetQuoteItems { get; set; }
}

我已尝试使用和不使用 [Required] 注释,但仍然遇到此问题。问题是,如果我创建一个新报价,报价类型 ID 默认为 0,因此如果用户不选择类型,模型仍然有效。我希望模型通过不将外键默认为一个值而使自己失效,但是我无法弄清楚为什么外键会默认为一个值,因为我的大部分研究表明它通常默认为 null 要求一个提供身份证。

如何让外键 'QuoteTypeID' 没有默认值但需要设置值?

此外,为了清楚起见,BaseModel 仅提供了一些我想要在我的大多数模型中使用的标准字段,例如“CreatedOn”和“CreatedBy”。

【问题讨论】:

  • 添加显式设置器,在设置类型时设置 Id
  • 我不完全确定我是否遵循。如果不存在类型,我无法显式设置类型。如果没有设置报价类型,我的目标是让报价失败。但是目前,它成功地将其设置为“0”,这被认为是一个有效的模型,这会导致引发异常,因为 SaveChanges() 调用将无法将其插入表中。
  • 你在说什么?如果不存在任何类型,则您的密钥应该可以为空。如果在 setter 中设置类型时它们类型存在,则还要设置 id
  • 我有一个外键,在创建新对象时默认为零。这个默认的零值意味着它通过了模型验证,导致由于未满足外键约束而引发 SQL 异常。如果未选择任何类型,或者不存在类型,则默认为零,这意味着我无法在没有手动验证的情况下以提供信息的方式处理它。如果未设置外键使模型无效而不是导致异常,我更愿意。允许密钥可以为空不会这样做。如果类型已经存在,则设置密钥。
  • >" 如果未设置外键使模型无效而不是导致异常,我更愿意" 如果是这种情况,您可以通过 2 种方式进行操作,创建一个通用的基本验证器将数据注释应用于具有外键属性的每个字段。或者创建一个通用基础验证器,它在保存之前执行等效操作

标签: c# .net entity-framework models code-first


【解决方案1】:

[ForeignKey("QuoteTypeID")]

应放在外键本身之上,并应在引号中包含型号名称,即,

[ForeignKey("QuoteType")]
[Required]
public int QuoteTypeID { get;set; }

【讨论】:

  • 抱歉,我照原样复制了这个,但是 [Required] 和 [ForeignKey] 都已被移动并尝试了多种不同的方式,但没有任何变化。它仍然默认为 0,并允许以这种方式将其保存到数据库中。
  • 在这种情况下,EF 数据迁移可能不会检测到更改,因为它很小。请查看 Chris Pratt 在stackoverflow.com/questions/28547951/… 上的回答,它可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2018-11-08
  • 2011-12-26
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
相关资源
最近更新 更多