2015-11-02 3 views
0

Этот вопрос задан довольно много раз, но ни один из ответов не помог. Я вставляю в таблицу (SQL Server 2014, EF 6), и я получаю сообщение об ошибке Cannot insert the value NULL into column 'Id' ... column does not allow nulls. Столбец Id установлен в моей БД как первичный ключ И является столбцом идентификации, я проверил три раза, , Я могу вставить без указания идентификатора, использующего T-SQL в SSMS, но EF терпит неудачу. Проходит 0 для значения; Я не понимаю, почему это не принято. Я не использую аннотации данных, я использую только свободное отображение.Невозможно вставить значение NULL в столбец «Идентификатор», столбец является личным и PK

This answer и this answer оба используют аннотации данных и не должны использоваться для этого проекта. Это правильно работало без аннотаций; Я понятия не имею, что изменилось, чтобы вызвать это.

Класс:

namespace Nop.Core.Domain.Common 
{ 
    public partial class GenericAttribute : BaseEntity 
    { 
     // Id is inherited from BaseEntity 
     public virtual int EntityId { get; set; } 
     public virtual string KeyGroup { get; set; } 
     public virtual string Key { get; set; } 
     public virtual string Value { get; set; } 
    } 
} 

Fluent карта:

namespace Nop.Data.Mapping.Common 
{ 
    public partial class GenericAttributeMap : EntityTypeConfiguration<GenericAttribute> 
    { 
     public GenericAttributeMap() 
     { 
      ToTable("GenericAttribute"); 
      HasKey(ga => ga.Id); 

      Property(ga => ga.KeyGroup).IsRequired().HasMaxLength(400); 
      Property(ga => ga.Key).IsRequired().HasMaxLength(400); 
      Property(ga => ga.Value).IsRequired(); 
     } 
    } 
} 

Код для обновления:

prop = new GenericAttribute() 
     { 
      EntityId = entity.Id, 
      Key = key, 
      KeyGroup = keyGroup, 
      Value = valueStr 
     }; 
// calls _repository.Insert(), which then calls _context.SaveChanges(); 
InsertAttribute(prop); 

Profiler показывает только SELECT, не INSERT попыток:

{SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[EntityId] AS [EntityId], 
    [Extent1].[KeyGroup] AS [KeyGroup], 
    [Extent1].[Key] AS [Key], 
    [Extent1].[Value] AS [Value] 
FROM [dbo].[GenericAttribute] AS [Extent1]} 
+2

Я подозреваю, что EF передает сам идентификатор, поэтому он вообще не будет запрашивать СУБД. используйте свободный API с свойством (x => x.Id) .HasDatabaseGeneratedOption (DatabaseGeneratedOption.Identity); чтобы исправить это. – DevilSuichiro

+0

@DevilSuichiro Я просто попробовал это, эта же ошибка бросается. – vaindil

+0

Можете ли вы использовать профайлер и проверить создаваемый SQL? – DrewJordan

ответ

0

Звучит так, как будто вам не хватает настройки в столбце auto_increment. Посмотрите на то, как это на вашем столе:

MySQL:

ALTER TABLE table_name MODIFY COLUMN coumn_name INT auto_increment 

T-SQL:

ALTER TABLE table_name ADD column_name int NOT NULL IDENTITY (1,1) PRIMARY KEY 
+2

'AUTO_INCREMENT' в ** MS SQL Server **? Скорее «IDENTITY» и OP говорят: «Столбец« Идентификатор »установлен в моей БД как первичный ключ И является столбцом идентификации, я проверил три раза.» « – lad2025

+0

Итак, может быть, вам просто нужно указать приращение кусок. ALTER TABLE MyTable ADD имя_таблицы int NOT NULL IDENTITY (1,1) –

0

Попробуйте добавить следующие строки в классе конфигурации отображения

Property(ga => ga.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
0

Я не так хорошо знаком с FluentAPI, но я подозреваю, что это связано с вашей иерархией наследования: то есть NU Значение LL, которое он видит, фактически находится на вашем BaseEntity, а не на самом GenericAttribute. This blog предполагает, что вы должны сопоставлять с HasKey() родительским классом, а - не дочерний класс. Это не имеет значения для базы данных, но EF, вероятно, пытается найти экземпляр родителя.

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