首页 > 解决方案 > C# Code-First 无法识别数据注释

问题描述

当我使用Update-Database时,它通常运行得很好,并且我在 SQL 端看到了我的更改。当我创建模型时,所有属性都已使用Required,但删除此注释后,映射列仍然是not null. 我已经通过添加和删除列来测试我的迁移设置,这工作正常。

我的模型是这样的:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Company.Employees {

    [Serializable]
    [Table("EmployeeRecords")]
    public class EmployeeRecords {

        [Key]
        [Required]
        public Guid EmployeeID { get; set; }

        [Required]
        [Display(Name = "Date Submitted")]
        public DateTime DateSubmitted { get; set; }

        [Display(Name = "Date Processed")]
        public DateTime? DateProcessed { get; set; }

        [Required]
        [Display(Name = "Submitted By")]
        public string SubmittedBy { get; set; }

        [Required]
        [Display(Name = "Employees")]
        public Int16 Employees { get; set; }

        [Required]
        [Display(Name = "Total Wages")]
        public decimal TotalWages { get; set; }

        [Required]
        [Display(Name = "Total Benefits")]
        public decimal TotalBenefits { get; set; }

        public List<EmployerReference> EmployerReferences { get; set; }
    }
}

你会看到属性DateProcessed不是[Required]. 但 EF 没有看到这一点。

我还使用其他数据注释进行了测试。我添加[MaxLength(450)],然后运行更新数据库。这行得通,在 SQL 中,映射列更改为VARCHAR(450)

有可能我已经走了,这是我第一个使用代码优先的应用程序。如果需要更多信息,请告诉我。谢谢!!

编辑:

我刚刚尝试使用这样的 Fluent API:

modelBuilder.Entity<RemittanceBatch>().Property(m => m.DateProcessed).IsOptional();
base.OnModelCreating(modelBuilder);

这也不起作用。

编辑2:

它允许我使该DateSubmitted字段可以为空。但不允许我使该DateProcessed字段可为空。这里有什么区别......嗯

标签: c#sqlasp.net-mvcef-code-first

解决方案


所以,我可能永远无法弄清楚真正的问题是什么。在这一点上,我愿意将其称为错误。这是修复它的方法。

  • 从模型中删除属性
  • 运行Update-Database
  • 再次添加属性
  • 运行Update-Database

魔法!有用!


推荐阅读