为什么它尝试在主键属性 ID 中插入 NULL. MVC5 EF6



我正在使用实体框架 6 Code First MVC5。这是我的班级:

报价.cs

 public class Offer
    {
        public int Id { get; set; }
        [Required]
        public string ListOffer { get; set; }
    }

这是我的控制器

[HttpPost]
public ActionResult Create(OfferFormViewModel viewModel)
{
        var offer = new Offer
        {
            ListOffer = viewModel.ListOffer,
        };
            _context.Offers.Add(offer);
            _context.SaveChanges();
        return RedirectToAction("MyOffers", "Offers");
     }

OfferFormViewModel.cs

public class OfferFormViewModel {
   public int Id { get; set; }
   [Required]
   public string ListOffer { get; set; }
}

当我尝试在报价表中插入记录时,它在我的机器上工作正常并在数据库中插入记录,它会自动将值分配给 id 列。但是当我部署应用程序时,它会抛出异常

System.Data.SqlClient.SqlException:无法将值 NULL 插入到列 'Id' 中,表 'DefaultConnection.dbo.Offers';列执行 不允许空值。插入失败。该语句已终止。

我的问题是,为什么在部署应用程序时尝试在 Id 列中插入 NULL,而不是在没有部署的情况下运行代码时?

部署应用程序时,我将数据库复制到服务器。在服务器上,Id 列未设置为主键,它也不是标识列。我认为将数据库复制到服务器时出了点问题。这就是它抛出异常的原因。

使用此模型并通过迁移更新数据库 您可以通过以下步骤执行此操作:

  1. 打开"> NuGet 包管理器">"包管理器控制台

  2. "的工具。
  3. 程序包管理器控制台中输入enable-migrations

  4. 输入add-migration {name}(确保您的应用程序可以毫无错误地生成)。

  5. 输入 update-database

    public class Offer
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [Required]
        public string ListOffer { get; set; }
    }
    

您应该使用自动增量,使用数据注释:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
 public int Id { get; set; }

或流利的API

   modelBuilder.Entity<Offers>()
        .Property(c => c.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

最新更新