Невозможно вставить явное значение для столбца идентификаторов в таблице, если для параметра IDENTITY_INSERT установлено значение OFF. " - PullRequest
0 голосов
/ 05 октября 2018

Для моего API я использую Entity Framework Core с первой миграцией кода.Я создал некоторые отношения, которые работают нормально.Теперь я добавил еще одно отношение (один ко многим), и внезапно меня шлепнули по ушам с этой ошибкой:

Cannot insert explicit value for identity column in table 'Companies' when IDENTITY_INSERT is set to OFF."

Конечно, я, должно быть, делаю что-то не так, ноЯ просто не могу понять что .Я встречал больше вопросов, таких как этот, где ответом было «установить IDENTITY_INSERT на ON», но это не работает для меня, так как EF обрабатывает все.

Мой класс компании, который может принадлежать группе:

public class Company
{

// Primary key
public int Id { get; set; }

// The optional Id of a Group
public int? GroupID { get; set; }

...

}

И класс группы:

public class Group
{

// Primary key
public int Id { get; set; }

// Name of the Group
public string Name { get; set; }

// List of Companies in this group
public IEnumerable<Company> Companies { get; set; }
}

Код, используемый для обработки POST:

// POST api/groups
[HttpPost]
public async Task<IActionResult> Post([FromBody] Group group)
{
  try
  {
    if (ModelState.IsValid)
    {
      _context.Groups.Add(group);
      await _context.SaveChangesAsync();
      return CreatedAtRoute("GetGroup", new { id = group.Id }, group);
    }

    return BadRequest(ModelState);
  }
  catch (Exception e)
  {
    return BadRequest($"Unable to create: {e.Message}");
  }
}

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

Класс, который я пытаюсь добавить в базу данных:

Ответы [ 2 ]

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

Проблема в том, что для EF нет подсказки, чтобы узнать, явно ли вставляется Company (при Group отношении) или предполагается, что он использует уже существующий из базы данных.

эти экземпляры отключены от DbContext, и нет никаких указаний на то, существуют ли они в базе данных к моменту, когда EF попытается сгенерировать свою команду SQL.

Здесь нет простого способа, по крайней мере, не быловремя, когда я играл с EF Core.

Вы должны либо:

  1. Изменить свой код, чтобы использовать только ID вместо свойства навигации, чтобы избежать этого при любой возможности, либо;
  2. Измените свой код, чтобы получить связанные данные (например: извлечь Company и присоединить его к Group) перед сохранением нужных данных (например: перед сохранением Group).

Так, например,:

var companyDB = await context.Companies.SingleOrDefaultAsync(c => c.Id == group.Company.Id);
group.Company = companyDB;
context.Groups.Add(group);
await context.SaveChangesAsync();

Да, вы совершаете две поездки в базу данных.Вот почему я бы предложил использовать первый подход, чтобы вы могли избежать этой выборки и просто сохранить Group сущность непосредственно в БД.

Это, однако, не запрещает вам отправлять навигационную систему Company на ваш взгляд.Просто создайте некоторые связанные с сущностью классы, которые будут соотноситься с вашей базой данных, чтобы вы могли загружать / сохранять данные, используя этот тип сущности, и создавать объект Dto, который будет вашим входом / выходом для конечной точки при необходимости.

Bindingодно в другое можно сделать с помощью AutoMapper, ручного linq или других подходов.

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

Это потому, что вы передаете какое-то значение в столбце, который установлен как идентификатор (автоинкремент).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...