我们有一个名为'Sites'的数据库 此表包含列,SiteID,名称,标签,描述,URI,其中SiteID是主键(它未设置为标识,因为我们要添加自己的ID)
我们一直在使用.NET 4.0 MVC和C#,并在我们需要的代码中设置了所有内容。
我们可以从数据库中选择并显示它们,以便我们知道它正在运行。
但是当我们尝试插入时,我们会收到Cannot insert the value NULL into column 'SiteID'
错误。
如果我将列设置为Identity以便自动生成,或者如果我取下主键那么它就没问题了,但正如我所说它应该是主键,我们想插入自己的ID。 / p>
我的代码如下(我们在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<ContentTypeModel> ContentType { get; set; }
//public DbSet<LayoutModel> Layout { get; set; }
//public DbSet<PageModel> Page { get; set; }
//public DbSet<PageZoneModel> PageZone { get; set; }
public DbSet<Sites> Site { get; set; }
//public DbSet<ZoneContentModel> ZoneContent { get; set; }
//public DbSet<ZoneTypeModel> 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 Framework 4中的一个错误,还是我们只是做错了什么?
如果我们找不到将ints插入主键列的方法,我们可能只需要使用字符串来验证它们以确保它们是数字。
答案 0 :(得分:27)
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; }
}
DbContext
。 public class CMSModels : DbContext
{
//public DbSet<ContentTypeModel> ContentType { get; set; }
//public DbSet<LayoutModel> Layout { get; set; }
//public DbSet<PageModel> Page { get; set; }
//public DbSet<PageZoneModel> PageZone { get; set; }
public DbSet<Sites> Site { get; set; }
//public DbSet<ZoneContentModel> ZoneContent { get; set; }
//public DbSet<ZoneTypeModel> ZoneType { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Sites>().Property(r => r.SiteID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}
}
答案 1 :(得分:0)
我认为您可以理解您的问题,并在阅读本文时解决它:http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/