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

Jak*_*cas 13 c# entity-framework-4

我们有一个名为'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; }
}
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

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());
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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

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

这只是Entity Framework 4中的一个错误,还是我们只是做错了什么?

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

dkn*_*ack 27

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

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; }
    }
Run Code Online (Sandbox Code Playgroud)

2.在您的模型中使用模型构建器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);
      }
    }
Run Code Online (Sandbox Code Playgroud)