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

时间:2017-01-25 10:51:07

标签: entity-framework asp.net-mvc-5

我正在使用Entity Framework 6 Code First MVC5。这是我的课程:

Offer.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',table' DefaultConnection.dbo.Offers&#39 ;;专栏   不允许空值。 INSERT失败。声明已经终止。

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

3 个答案:

答案 0 :(得分:1)

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

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

或FluentAPI

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

答案 1 :(得分:1)

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

  1. 打开工具&gt; NuGet包管理器&gt;包管理器控制台

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

答案 2 :(得分:0)

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