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

时间:2011-07-19 14:35:58

标签: c# entity-framework-4

我们有一个名为'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插入主键列的方法,我们可能只需要使用字符串来验证它们以确保它们是数字。

2 个答案:

答案 0 :(得分: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; }
    }

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);
      }
    }

答案 1 :(得分:0)

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