二元运算符 Equal 未在类型 Nullable<Int32> 之间定义.和 Int32 [英] The binary operator Equal is not defined between type Nullable&lt;Int32&gt; and Int32

查看:24
本文介绍了二元运算符 Equal 未在类型 Nullable<Int32> 之间定义.和 Int32的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下模型:

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; }
}

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

which I seed through the package manager console with the command update-database and the following code in the configuration.cs for the migration:

    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  }
    );

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

However, whenever it tries to run this line of code I get the following error in the console:

The binary operator Equal is not defined for the types 'System.Nullable`1[System.Int32]' and 'System.Int32'.

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

does anyone know how to fix this problem, I have tried looking for answers but most of the solutions are to make it non-nullable and just accept a zero but I don't want to do this as I need to use a zero value for some of the fields

更新

进一步研究后,我将范围缩小到运行更新的列表:如果我从行中省略 d.PORT

Having played with this further, I have narrowed this down to the list of things the update is run on: if I leave out the d.PORT from the line

d => new { d.ProfileName, d.IPAD, d.PORT, d.IsActive }

然后更新工作正常.当然必须有一种方法可以让更新也查看这个字段,否则如果它甚至不能处理像可为空的 int 之类的简单事情,那么使用 mvc 似乎毫无用处

then the update works fine. Surely there must be a way to make the update also look at this field otherwise it seems that using mvc is pretty useless if it can't even handle a simple thing like a nullable int

推荐答案

尝试使用 Fluent API 将字段显式设置为 Optional:

Try setting the field to Optional explicitly using the 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();
        }
    }

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

This should force the type to be nullable.

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

For some reason, declaring your property as int? instead of Nullable<int> will cause EF to generate your property as expected as well.

这篇关于二元运算符 Equal 未在类型 Nullable<Int32> 之间定义.和 Int32的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆