【问题标题】:Why it is trying to insert NULL in primary key property id.. MVC5 EF6为什么它试图在主键属性 id 中插入 NULL .. MVC5 EF6
【发布时间】:2017-06-10 12:27:44
【问题描述】:

我正在使用 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; }
}

当我尝试在 offer 表中插入一条记录时,它在我的机器上运行良好,并将记录插入到数据库中,它会自动为 id 列分配值。但是当我部署应用程序时,它会抛出异常

System.Data.SqlClient.SqlException:无法将值 NULL 插入到列“Id”、表“DefaultConnection.dbo.Offers”中;列确实 不允许空值。插入失败。声明已终止。

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

【问题讨论】:

  • 问题很可能出在数据库端。 Id 应该是一个自动增量字段(在 SQL Server 中应该是 Identity)

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    2. 包管理器控制台

    3. 中输入enable-migrations
    4. enteradd-migration {name}(确保您的应用程序可以正确构建)。

    5. 输入update-database

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

    【讨论】:

      【解决方案3】:

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

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

      或 FluentAPI

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

      【讨论】:

      • 我认为我们不需要为名为 Id 的属性使用 DatabaseGenerated 属性。
      猜你喜欢
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 2016-03-15
      相关资源
      最近更新 更多