Код сначала сводит меня с ума исключением внешнего ключа

#c# #entity-framework #entity-framework-4.1

#c# #entity-framework #entity-framework-4.1

Вопрос:

Это мои классы моделей:

 public class Organization
{
        public Organization()
        {
        }

        [DisplayName("Organization Id")]
        public int OrganizationId { get; set; }

        [StringLength(128)]
        [DisplayName("Organization Name")]
        public string Name { get; set; }
}

public class User 
{
        public User()
        {
            Roles = new List<Role>();
        }

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
        [Key]
        public Guid UserGuid { get; set; }

        [StringLength(25)]
        public string FirstName { get; set; }

        [StringLength(25)]
        public string LastName { get; set; }

        public virtual List<Role> Roles { get; set; }

        public int OrganizationId { get; set; }

        [ForeignKey("OrganizationId")]
        public virtual Organization Organization { get; set; }
    }
  

Это мой код:

  Organization organization = new Organization { Name = "Test", };
 context.Organizations.Add(organization);
  

И я получаю это:

Оператор INSERT конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА «Organization_Users «. Конфликт произошел в базе данных «SampleDB «, таблице «dbo.Организации», столбец ‘OrganizationId’.r n Инструкция была завершена.

Разве это не странно? Я просто добавляю организацию. Какая проблема может быть в этом?

P.S: В моей пользовательской таблице действительно есть OrganizationId то есть внешний ключ, указывающий на Organization таблицу. Пока все хорошо, но почему генерируется исключение? Я добавляю основную Organization запись. Как это нарушает ограничение внешнего ключа?

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

1. Если бы мне пришлось догадываться, OrganizationId — это внешний ключ. В основном это означает, что Организация не существует, ни в какой таблице, на которую она ссылается.

2. Где внешний ключ Organization_Users ? Вы не показываете это в своем коде. Это поле Organization таблицы?

3. @Otiel: Это имя отношения внешнего ключа, которое автоматически генерируется Sql Server.

Ответ №1:

Я бы ожидал, что идентификатор базы данных будет сгенерирован и для организации:

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
   [DisplayName("Organization Id")]
   public int OrganizationId { get; set; }
  

Либо это, либо вам нужно самостоятельно присвоить ему допустимое уникальное значение перед сохранением

Альтернативное предположение:

Название Organization_Users предполагает, что существует (или была) связь из таблицы организации с пользователями (возможно, через таблицу отношений). Вы показали полный код? Код, в базе данных есть остатки этой старой связи? Недостаточно удалить такие отношения только из кода C # (потому что база данных будет продолжать проверять ограничения, пока неиспользуемые поля / отношения не будут удалены из фактической схемы базы данных).

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

1. Это уже сгенерированная база данных, потому что она соответствует соглашению className Id. Итак, Code first автоматически создает его автоматически. В любом случае, использование явного атрибута DatabaseGenerated по-прежнему не решает проблему.

2. Существует связь с внешним ключом, которая автоматически устанавливается из-за этого кода: «[ForeignKey(«OrganizationId»)] общедоступная виртуальная организация Organization { get; set; }»

3. @Otiel: Это не связано с ответом.

4. ОК. Я нашел проблему. Проблема была в начальном методе. Я добавлял туда пользовательский объект и не назначал organizationId, который вызвал это исключение. Извините за неубедительность из-за моей глупой ошибки. Потратил 1 час на это.

5. Хе-хе. спасибо за обновление. Возможно, вы можете ответить на свой вопрос или пометить его как «РЕШАЕМЫЙ», чтобы другие не тратили время впустую 🙂

Ответ №2:

Похоже, что EF создал связь в неправильном направлении.

Пользовательский класс должен иметь Organization, а не OrganizationID.

Класс Organization должен иметь список пользователей.