我有以下型号:
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
和配置c中的以下代码进行迁移:
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'.
有没有人知道如何解决这个问题,我已经尝试寻找答案,但大多数解决方案是让它不可空,只是接受零,但我不想这样做,因为我需要使用一个某些字段的值为零
更新
进一步玩了这个,我把它缩小到运行更新的列表:如果我从行中省略d.PORT
d => new { d.ProfileName, d.IPAD, d.PORT, d.IsActive }
然后更新工作正常。当然必须有一种方法让更新也看看这个字段,否则似乎使用mvc是无用的,如果它甚至不能处理像nullable int这样的简单事情
答案 0 :(得分:2)
尝试使用Fluent API将字段设置为Optional:
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按预期生成您的财产。