SQLException: оператор INSERT конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА «FK_Users_Companies_CompanyId»

#c# #sql-server #entity-framework-core

#c# #sql-сервер #entity-framework-core

Вопрос:

Я хочу добавить нового пользователя в свою базу данных, но принимаю исключение. К сожалению, я новичок как в SQL Server, так и в EF, но поиск ответа заставил меня понять, что проблема где-то в таблицах SQL Server и невозможности подключения пользователя и компании там. Должен ли я что-то делать с Id или CompanyId или что?

SQLException: оператор INSERT конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА «FK_Users_Companies_CompanyId». Конфликт произошел в базе данных «companiesdb», таблица «dbo.Companies», столбец «Id». Оператор был завершен.

Код:

 public class User
{
        public string Name { get; set; }
        public int Age { get; set; }
        public int CompanyId { get; set; } // for what???
        public Company Company { get; set; }
        public int Id { get; set; } //for what?
}

public class Company
{
        public int Id { get; set; } //for what?
        public string Name { get; set; }
        public List<User> Users { get; set; }

        public Company()
        {
            Users = new List<User>();
        }
}

using Microsoft.EntityFrameworkCore;

namespace DataApp1.Models
{
    public class UserDb : DbContext
    {
        public DbSet<User> Users { get; set; } //create db for users
        public DbSet<Company> Companies { get; set; } //and for companies they belong
        public UserDb(DbContextOptions<UserDb> options)
            : base(options)
        {
            Database.EnsureCreated();
        }
    }
}
  

Комментарии:

1. Вы сообщили своей базе данных, что между пользователем и компанией существует связь. Что-то вроде «Пользователь работает в компании, а в компании работает много пользователей». Тогда, я полагаю, вы пытаетесь добавить пользователя, не указав требуемую ссылку на компанию (или ссылку на несуществующую компанию)

2. Да, я понял, но как я могу поместить требуемую ссылку на компанию и показать это прямое соединение между пользователем и компанией?

3. Начните писать код для добавления компаний в вашу таблицу companies. Затем при написании кода для добавления / изменения пользователя загружается какой-либо объект пользовательского интерфейса со списком уже сохраненных компаний. Наконец, требуйте, чтобы у каждого пользователя был идентификатор компании, извлеченный из вашего списка компаний

Ответ №1:

В вашем классе User, который, по-видимому, относится к вашей таблице Users, есть поле для CompanyID. Исходя из ошибки, ваша база данных требует, чтобы в БД каждый раз добавлялся правильный идентификатор компании.

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

Итак, ваш правильный программный поток будет:

  • Добавьте компанию в Companies, если она там не существует
  • Получите правильный идентификатор компании
  • Добавьте идентификатор компании в поле CompanyID в записи пользователя перед ее сохранением.

Комментарии:

1. (спасибо) но что мне делать с идентификатором столбца в компаниях в качестве закрытого ключа? Проблема существует (конфликт произошел в базе данных «companiesdb», таблица «dbo.Companies», столбец «Id».)

2. Если ваш внешний ключ находится в таблице Companies, то он разработан неправильно. Это должен быть внешний ключ в таблице Users, указывающий на таблицу Companies, поэтому при вставке в таблицу Users он ищет в таблице Companies запись со вставленным вами идентификатором компании. Если он не существует, то он возвращает эту ошибку. Кроме того, вы сказали, что добавляете нового пользователя. Таким образом, проблема должна быть при вставке в таблицу Users. Шаблон ссылки FK сбивает с толку, но утверждение «Конфликт произошел в» относится к ссылочной базе данных, а не к БД, в которую вставляется.

3. Если у вас все еще возникают трудности, вы можете посмотреть, какое значение отправляется в SQL в вашей инструкции insert для CompanyID. Затем проверьте таблицу Company, чтобы увидеть, существует ли она.