Проблема с EntityFramework 6 (Code First) Взаимодействие идентификатора SQL DB - EF пытается вставить явное значение в столбец идентификаторов - PullRequest
0 голосов
/ 17 мая 2018

У меня есть база данных SQL, с таблицей, состоящей из нескольких столбцов, со столбцом user_id, установленным в качестве PK и идентификатора.

Это код таблицы:

CREATE TABLE [dbo].[Users] (
[user_id]   INT            IDENTITY (1, 1) NOT NULL,
[firstname] NVARCHAR (25)  NOT NULL,
[lastname]  NVARCHAR (25)  NOT NULL,
[title]     NVARCHAR (10)  NOT NULL,
[email]     NVARCHAR (50)  NOT NULL,
[password]  NVARCHAR (255) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([user_id] ASC)
);

При попытке сохранить новый объект в БД выдается ошибка

SqlException: Cannot insert explicit value for identity column in table 
'Users' when IDENTITY_INSERT is set to OFF.

Сохраняемый объект не получает 'user_id'.

DBContext для'user_id':

entity.Property(e => e.UserId).HasColumnName("user_id");

и был автоматически сгенерирован EFCorePowerTools.

Фактический класс пользователя имеет свойство 'UserID', которое связано с 'user_id' в DBContext.

    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity), Key]
    public int UserId { get; set; }

Идея состоит в том, чтобы позволить SQL DB обрабатывать генерацию ключей.

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

До сих пор я пытался:

Сделать 'UserID' в 'User' обнуляемым,

Имея только '[DatabaseGeneratedAttribute (DatabaseGeneratedOption.Identity)] в качествеаннотация для 'UserID'

Переделка базы данных, а затем повторная обработка DBContext

По какой-то причине, даже когда 'UserID' в 'User' аннотируется с помощью [NotMapped], я получаюта же ошибка, которая заставляет меня поверить, что есть проблема в фактической привязке DBContext.

Вот полный DBContext для 'Users':

modelBuilder.Entity<User>(entity =>
        {
            entity.Property(e => e.UserId).HasColumnName("user_id");

            entity.Property(e => e.Email)
                .IsRequired()
                .HasColumnName("email")
                .HasMaxLength(50);

            entity.Property(e => e.Firstname)
                .IsRequired()
                .HasColumnName("firstname")
                .HasMaxLength(25);

            entity.Property(e => e.Lastname)
                .IsRequired()
                .HasColumnName("lastname")
                .HasMaxLength(25);

            entity.Property(e => e.Password)
                .IsRequired()
                .HasColumnName("password")  
                .HasMaxLength(255);

            entity.Property(e => e.Title)
                .IsRequired()
                .HasColumnName("title")
                .HasMaxLength(10);
        });

И весь класс 'User':

public partial class User : DomainAppBase, IStorable
{
    public User()
    {
        Leads = new HashSet<Lead>();
    }

    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Title { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }

    public override void SetDefaultValues()
    {
        UserId = NullKey;
    }

    [NotMapped]
    public ICollection<Lead> Leads { get; set; }
    [NotMapped]
    public new int Key => UserId;
}

Буду очень признателен за любую помощь или указатели.Заранее спасибо.

1 Ответ

0 голосов
/ 17 мая 2018

Пожалуйста, обновите построитель модели, так как

modelBuilder.Entity<User>(entity =>
{
   entity.HasKey(o => o.UserId );
   entity.Property(e => e.UserId).ValueGeneratedOnAdd().HasColumnName("user_id")
 ...................

ValueGeneratedOnAdd позволяет генерировать значение при добавлении новой сущности.

...