C#.NET 4.0 MVC使用主键插入记录

我们有一个名为’Sites’的表的数据库这个表有列,SiteID,Name,Tags,Description,URI,SiteID是主键(它没有设置为Identity,因为我们想添加自己的ID)

我们一直在使用.NET 4.0 MVC和C#,并在我们需要的代码中设置了所有内容。 我们可以从数据库中选择并显示它们,以便我们知道它正在运行。 但是当我们尝试插入时,我们得到一个Cannot insert the value NULL into column 'SiteID'错误。

如果我将列设置为Identity以便它自动生成,或者如果我取下主键那么它就没问题,但正如我所说它应该是主键,我们想插入自己的ID。

我的代码如下(我们在SaveChanges()上得到了错误,但已经在调试器中检查过,并且SiteID肯定被分配了一个int)

网站

 public class Sites { [Key] public int SiteID { get; set; } public string Name { get; set; } public string Tags { get; set; } public string Description { get; set; } public string URI { get; set; } } 

CMSModels

 public class CMSModels : DbContext { //public DbSet ContentType { get; set; } //public DbSet Layout { get; set; } //public DbSet Page { get; set; } //public DbSet PageZone { get; set; } public DbSet Site { get; set; } //public DbSet ZoneContent { get; set; } //public DbSet ZoneType { get; set; } } 

HomeController的:

 private CMSModels models = new CMSModels(); public ActionResult Index() { Sites site = new Sites { SiteID = 4, Name = "Name", Description = "Desc", Tags = "", URI = "" }; models.Site.Add(site); models.SaveChanges(); return View(models.Site.ToList()); } 

我不明白为什么我会收到这个错误,所以任何想法都会受到赞赏。

如果您需要查看任何其他代码,请告诉我们。

编辑:

只是为了稍微扩展这个问题,似乎这只发生在int类型的主键上。

如果我们将数据库列数据类型设置为nvarchar并将代码中的数据类型设置为字符串,则它可以正常工作。

这只是entity framework4中的一个错误,还是我们只是做错了什么?

如果我们找不到将ints插入主键列的方法,我们可能只需要使用字符串并validation它们以确保它们是数字。

如果您想要一个NO IDENTITY主键列,那么您手动设置id,则有两种可能的解决方案。

1.使用以下属性(DatabaseGenerated …)装饰您的id属性。

  public class Sites { [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public int SiteID { get; set; } public string Name { get; set; } public string Tags { get; set; } public string Description { get; set; } public string URI { get; set; } } 

2.使用DbContext的ModelBuilder执行此操作。

  public class CMSModels : DbContext { //public DbSet ContentType { get; set; } //public DbSet Layout { get; set; } //public DbSet Page { get; set; } //public DbSet PageZone { get; set; } public DbSet Site { get; set; } //public DbSet ZoneContent { get; set; } //public DbSet ZoneType { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().Property(r => r.SiteID) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); } } 

我想你可以理解你的问题,并在阅读本文时解决它: http : //leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/