二进制运算符Equal未在类型Nullable <Int32>和Int32之间定义

Pet*_*ete 11 entity-framework model asp.net-mvc-4

我有以下型号:

public class DeviceConfigurationModel
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Display(Name = "Device Configuration Id")]
    public int DeviceConfigurationId { get; set; }

    [Required]
    [Display(Name = "Device Profile Name")]
    [StringLength(50)]
    public string ProfileName { get; set; }

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

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

    public Nullable<int> PORT { get; set; }

    [Required]
    [Display(Name = "Is Active")]
    public bool IsActive { get; set; }

    [Required]
    [Display(Name = "Date Created")]
    public DateTime DateCreated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我通过包管理器控制台使用命令update-database和配置ccs中的以下代码进行迁移:

    context.DeviceConfigurations.AddOrUpdate(
         d => new { d.ProfileName, d.IPAD, d.PORT, d.IsActive },
              new DeviceConfigurationModel { ProfileName = "FMG Default Gateway", IPAD = "77.86.28.50", PORT = (int?)90, IsActive = true  }
    );
Run Code Online (Sandbox Code Playgroud)

但是,每当它尝试运行这行代码时,我在控制台中都会收到以下错误:

The binary operator Equal is not defined for the types 'System.Nullable`1[System.Int32]' and 'System.Int32'.
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何解决这个问题,我已经尝试寻找答案,但大多数解决方案是使其不可空,只是接受零,但我不想这样做,因为我需要使用零值为一些领域

UPDATE

进一步玩了这个,我把它缩小到更新运行的列表:如果我省略d.PORT了线

d => new { d.ProfileName, d.IPAD, d.PORT, d.IsActive }
Run Code Online (Sandbox Code Playgroud)

然后更新工作正常.当然必须有一种方法让更新也看看这个领域,否则似乎使用mvc是没有用的,如果它甚至不能处理一个像nullable int这样的简单事情

Mac*_*iej 2

尝试使用 Fluent API 显式将该字段设置为可选:

 public class YourContext : DbContext
    {
        public DbSet<DeviceConfigurationModel> DeviceConfigurations { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<DeviceConfigurationModel>().Property(x => x.PORT).IsOptional();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这应该强制类型可以为空。

由于某种原因,将您的属性声明为而int?不是Nullable<int>会导致 EF 也按预期生成您的属性。

  • 这对我不起作用...我的 AddOrUpdate() 仍然抛出此异常。 (7认同)
  • 我认为没有解决方案...... IsOptional 解决不了任何问题 (2认同)
  • 有没有人找到解决这个问题的方法?接受的答案似乎不再有效。使用EF 6.1 (2认同)