C # .NET 4.0 MVC Вставка записи с первичным ключом - PullRequest
13 голосов
/ 19 июля 2011

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

Мы использовали .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());
}

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

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

Edit:

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

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

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

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

Ответы [ 2 ]

27 голосов
/ 19 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...