Подтвердить что ты не робот

Бинарный оператор 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 для миграции:

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

Однако всякий раз, когда он пытается запустить эту строку кода, я получаю следующую ошибку в консоли:

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

Кто-нибудь знает, как исправить эту проблему, я попытался найти ответы, но большинство решений - сделать его непустым и просто принять ноль, но я не хочу этого делать, поскольку мне нужно использовать нулевое значение для некоторых полей

UPDATE

Играя с этим дальше, я сузил это до списка вещей, над которыми выполняется обновление: если я оставлю d.PORT из строки

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

тогда обновление работает нормально. Конечно, должен быть способ сделать обновление также взглядом на это поле, иначе кажется, что использование mvc довольно бесполезно, если он не может даже обрабатывать простую вещь, такую ​​как nullable int

4b9b3361

Ответ 1

Попробуйте установить поле Необязательно, используя 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();
        }
    }

Это должно заставить тип быть нулевым.

По какой-то причине объявление вашего свойства как int? вместо Nullable<int> приведет к тому, что EF будет генерировать ваше свойство так же, как ожидалось.