«Невозможно вставить явное значение для столбца идентификаторов в таблице» при вставке объекта с помощью EF Core - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь вставить новую строку в мою таблицу, используя EF Core, SQL Server и C #, но у меня возникают проблемы с тем, чтобы EF Core правильно использовал столбец идентификаторов.

Вот что я делаю:

Я создаю новый объект, используя сгенерированный класс Entity Framework (определение класса сущности я включил в конце моего сообщения)

EmployeePermissions employee_permission = new EmployeePermissions
{
    FkEmployee = PkEmployee,
    FkPermission = permission_key
};

Затем я вызываю db.EmployeePermissions.add(employee_permission), который работает на всех моих вызовах, откуда приходит объект [FromBody] <Entity Class> <object_variable> (хотя и с использованием других таблиц).

Но здесь, когда я сам создаю экземпляр класса, я получаю эту ошибку:

SqlException (0x80131904): Невозможно вставить явное значение для столбца идентификаторов в таблице 'Employee_Permissions', когда IDENTITY_INSERT имеет значениеустановите на OFF.

Я не понимаю, почему это происходит - я хочу, чтобы он автоматически увеличивал столбец идентификаторов. Я использовал ObjectDumper, чтобы посмотреть, что передается .Add(), а именно:

properties {
    PkEmployeePermissions = 0 [System.Int32] // this is the identity column, of course
    FkEmployee = 31 [System.Int32]
    FkPermission = 6 [System.Int32]
    FkEmployeeNavigation = <null>
    FkPermissionNavigation = <null>
}

Я исследовал другие вызовы, которые работают нормально (те, где [FromBody] создает объект) и столбец идентификаторов просто равен 0 в этих вызовах, поэтому я не понимаю, что здесь отличается.

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

Вот класс Entity, если он помогает:

public partial class EmployeePermissions
{
    public int PkEmployeePermissions { get; set; }
    public int FkEmployee { get; set; }
    public int FkPermission { get; set; }

    public Employee FkEmployeeNavigation { get; set; }
    public Permission FkPermissionNavigation { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Оказалось, что я обновил столбец первичного ключа, PkEmployeePermission, чтобы он стал столбцом идентификаторов, и забыл заново создать леса базы данных с помощью EF Core.

Основная причинапроблема заключалась в том, что внутри метода OnModelCreating() (в сгенерированном файле контекста базы данных) поле PkEmployeePermission вызывалось методом .ValueGeneratedNever(), что означало, что, хотя это был первичный ключ, EF Core неавтоматически генерировать увеличенное значение для этого столбца. Комментируя этот метод в файле контекста базы данных, код работал правильно.

0 голосов
/ 04 октября 2019

Соглашение по умолчанию гласит, что первичный ключ класса должен называться либо Id, либо (classname)Id - это не так в вашем классе.

Также: если вы сопоставляете сIDENTITY столбец в SQL Server, необходимо добавить соответствующую аннотацию данных в ключевой столбец.

Попробуйте это:

public partial class EmployeePermissions
{
    // add the [Key] annotation to indicate the primary key of the class/table
    [Key]
    // add the [DatabaseGenerated(..)] annotation to indicate an IDENTITY column in the table
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PkEmployeePermissions { get; set; }
    public int FkEmployee { get; set; }
    public int FkPermission { get; set; }

    public Employee FkEmployeeNavigation { get; set; }
    public Permission FkPermissionNavigation { get; set; }
}

Теперь вы сможете вставить эти объекты и иметьони правильно хранятся в вашей таблице SQL Server.

...