#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 должен иметь список пользователей.