2015-12-04 4 views
3

Я работаю с SQL SERVER 2012, C#, .NET Framework 4.0 и Entity Framework Code First 6.1.3.Вставить значение в первичный ключ не идентичности

Я создал эту таблицу с SQL:

CREATE TABLE [dbo].[PRODUCTS] 
(
    [PRODUCT_ID] INT NOT NULL PRIMARY KEY, 
    [PRODUCT_CODE] NVARCHAR(20) NOT NULL, 
    [DESCRIPTION] NVARCHAR(50) NULL, 
    [LAW] TINYINT NOT NULL 
) 

Для доступа к нему с EF у меня есть этот класс:

public class PRODUCTS 
{ 
    public int PRODUCT_ID { get; set; } 
    public string PRODUCT_CODE { get; set; } 
    public string DESCRIPTION { get; set; } 
    public byte LAW { get; set; } 
} 

При такой конфигурации:

class PRODUCTSConfiguration : EntityTypeConfiguration<PRODUCTS> 
{ 
    public PRODUCTSConfiguration() 
    { 
     HasKey(p => p.PRODUCT_ID); 

     Property(p => p.PRODUCT_CODE) 
      .HasMaxLength(20) 
      .IsRequired(); 

     Property(p => p.DESCRIPTION) 
      .HasMaxLength(50) 
      .IsOptional(); 

     Property(p => p.LAW) 
      .IsRequired(); 
    } 
} 

Но когда я попробуйте вставить новую строку в эту таблицу, используя Entity Framework. Я получаю исключение в dbContext.SaveChanges();, говоря: что PRODUCT_ID не может быть пустым:

Вы не можете вставить значение NULL в столбце «PRODUCT_ID», ИЗДЕЛИЯ стол. Столбец не допускает значения NULL. Ошибка INSERT.Se инструкция.

вставить новый продукт, который я это сделать:

PRODUCTS dataProduct = new PRODUCTS() 
{ 
    PRODUCT_ID = product.Id, 
    PRODUCT_CODE = product.ProductCode, 
    LAW = product.Law, 
    DESCRIPTION = product.Description 
}; 

dbContext.Add(dataProduct); 
dbContext.SaveChanges(); 

Но я отлажена и PRODUCT_ID имеет значение.

Нужно ли мне что-то делать, чтобы вставить это значение на столбец PRODUCT_ID?

Кстати, мне нужно вставить значение в столбец PRODUCT_ID, я не могу использовать IDENTITY.

ответ

0

Я действительно не вижу, как идентификатор может быть пустым, учитывая, что он объявлен как int, а не, скажем, int?. Если есть экземпляр объекта, тогда должно быть значение - возможно, 0, если что-то пошло не так с инициализацией объекта.

Код модели здания выглядит правильно, но в коде, который вы указываете для добавления элемента, есть причуда. Я бы ожидать что-то вроде

dbContext.Products.Add(dataProduct); 

с использованием DbSet под названием Products, а не

dbContext.Add(dataProduct); 

Я не себе, как это будет иметь значение, но было бы интересно узнать, что будь просто опечатка, или является частью проблемы.

Это работает, если вы добавите запись непосредственно в контекст, например?

dbContext.Entry(newStudent).State = System.Data.Entity.EntityState.Added; 
0

Рассмотрите, вместо того, чтобы иметь поле с прямым целым идентификатором, сделайте это как номер автонабора (IDENTITY). Если вы сделаете это IDENTITY, вы можете оставить product.Id = 0 и EF будет генерировать его автоматически. После того, как вызывается dbContext.SaveChanges, для вас будет установлен product.PRODUCT_ID, если вам нужен идентификатор созданного объекта.

+0

Извините, но это не ответит на мой вопрос. Я спрашиваю, почему, если я установил значение в 'PRODUCT_ID' EF, выведите исключение, указав, что значение столбца равно NULL. – VansFannel

Смежные вопросы