Сначала код - невозможно вставить значение NULL в столбец Id - PullRequest
27 голосов
/ 22 октября 2011

Это мой код, очень просто ...

 var newUser = new User();
        newUser.Id=id;
        newUser.Email = email;
       this.DataContext.Set<User>().Add(newUser);
        this.DataContext.SaveChanges();

Ошибка, которую я получаю - это sqlexception на this.DataContext.SaveChanges();, в которой говорится:

Невозможно вставить значение NULL в столбец 'Id', таблица 'xxxxx.dbo.Users'; столбец не допускает пустых значений. Вставить не удается.

Я отладил и обнаружил, что в Id & Email есть значение в newUser this.DataContext.Set<User>().Add(newUser);

Если это так, как значение становится нулевым?

Трассировка стека ошибок:

[DbUpdateException: An error occurred while updating the entries. See the inner exception for details.]
   System.Data.Entity.Internal.InternalContext.SaveChanges() +204
   System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +23
   System.Data.Entity.DbContext.SaveChanges() +20

Я не смог понять или решить это ...

Искренне признателен за любую помощь в этом ...

С уважением Арнаб

Решение

Хорошо, спасибо Ладиславу, чтобы указать мне правильное направление: Добавление атрибута [DatabaseGenerated(DatabaseGeneratedOption.None)] решило проблему.

Ответы [ 3 ]

23 голосов
/ 25 марта 2013

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

Чтобы решить эту проблему, попробуйте:

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
    .Property(p => p.Id)
    .StoreGeneratedPattern = StoreGeneratedPattern.None;

builder.Entity<BOB>().MapSingleType().ToTable("BOB");

или украсьте свой ключ в POCO с помощью:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)] //Fixed typo
public Int64 PolicyID { get; set; }
7 голосов
/ 28 февраля 2012

Я столкнулся с той же проблемой, нашел ваш вопрос и затем заметил этот KeyAttribute Entity Framework 4.1 с кодом в виде столбца без идентификатора вопрос (который имеет атрибут, который решил мою проблему).

Если вы определяете пользователя как:

public class User
{
    [DataMember, Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long ID { get; set; }

    [DataMember]
    public string Email { get; set; }
}

Ключевым моментом здесь является размещение атрибутов:

  • Ключ
  • DatabaseGenerated

на столбец идентификатора. Очевидно, проблема, с которой мы боремся, заключается в том, что Entity Framework по умолчанию ожидает вставки с ключами, идентичными.

2 голосов
/ 02 августа 2013

Я исправил это, установив StoreGeneratedPattern в свойствах столбца на Computed.

Шаг за шагом ниже:

  1. Откройте свой EDMX (двойной щелчок в Visual Studio)
  2. Щелкните правой кнопкой мыши столбец, вызывающий проблему, выберите свойства.
  3. Измените StoreGeneratedPattern на Computed.

From the IDE enter image description here

Надеюсь, это кому-нибудь поможет.

...