我正在使用实体框架 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 列未设置为主键,它也不是标识列。我认为将数据库复制到服务器时出了点问题。这就是它抛出异常的原因。
使用此模型并通过迁移更新数据库 您可以通过以下步骤执行此操作:
-
打开"> NuGet 包管理器">"包管理器控制台
"的工具。 在程序包管理器控制台中输入
enable-migrations
输入
add-migration {name}
(确保您的应用程序可以毫无错误地生成)。输入
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);