C# .NET 4.0 MVC Вставка записи с первичным ключом

У нас есть база данных с таблицами под названием "Сайты". В этой таблице есть столбцы: SiteID, Name, Tags, Description, URI, первичным ключом является SiteID (он не установлен в качестве идентификатора, поскольку мы хотим добавить собственный идентификатор).

Мы использовали.NET 4.0 MVC с C# и настроили все в коде, который нам нужен. Мы можем выбирать вещи из базы данных и отображать их, чтобы мы знали, что это работает. Но когда мы пытаемся вставить, мы получаем Cannot insert the value NULL into column 'SiteID' ошибка.

Если я установлю столбец как Identity, чтобы он автоматически генерировался, или если я удалю первичный ключ, то это нормально, но, как я сказал, это должен быть первичный ключ, и мы хотим вставить собственные идентификаторы.

Мой код ниже (Мы получаем ошибку на 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, или мы просто делаем что-то не так?

Если мы не можем найти способ вставить целые числа в столбец первичного ключа, мы можем просто использовать вместо них строки и проверить их, чтобы убедиться, что они числовые.

2 ответа

Решение

Если вам нужен столбец первичного ключа NO IDENTITY, поэтому вы устанавливаете идентификатор вручную, у вас есть 2 возможных решения.

1. Украсьте свой идентификатор с помощью следующих атрибутов (DatabaseGenerated...).

    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. Сделайте это с помощью ModelBuilder в вашем 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);
      }
    }

Я думаю, что вы можете понять свою проблему и решить ее, прочитав эту статью: http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

Другие вопросы по тегам