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/