Подтвердить что ты не робот

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

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

Мы использовали .NET 4.0 MVC с С# и настроили все в коде, который нам нужен. Мы можем выбрать вещи из базы данных и отобразить их, чтобы мы знали, что они работают. Но когда мы пытаемся вставить, мы получаем ошибку 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());
}

Я не понимаю, почему я получаю эту ошибку, поэтому любые идеи будут оценены.

Если вам нужно увидеть какой-либо другой код, пожалуйста, дайте мне знать.

Edit:

Просто, чтобы немного расширить этот вопрос, кажется, что это происходит только для первичных ключей, которые имеют тип int.

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

Это просто ошибка в Entity Framework 4, или мы просто делаем что-то неправильно?

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

4b9b3361

Ответ 1

Если вам нужен столбец первичного ключа 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);
      }
    }