Вопрос здесь в том, как я могу сгенерировать составной первичный ключ, состоящий из двух внешних ключей?
Я пытался:
public class ActiveQuestions_Questions
{
[Column(Order = 0), Key, ForeignKey("ActiveQuestion")]
public string ActiveQuestionId {get; set;}
[Column(Order = 1), Key, ForeignKey("Question")]
public string QuestionId {get; set; }
}
Что дает мне: Тип объекта «ActiveQuestions_Questions» имеет составной первичный ключ, определенный с аннотациями данных. Чтобы установить составной первичный ключ, используйте свободный API.
Затем я попытался использовать свободный api в построителе моделей без аннотаций.
builder.Entity<ActiveQuestions_Questions>(
build =>
{
build.HasKey(t => new {t.ActiveQuestionId, t.QuestionId});
build.HasOne(t => t.QuestionId).WithOne().HasForeignKey<Question>(qe => qe.QuestionId);
build.HasOne(t => t.ActiveQuestionId).WithOne().HasForeignKey<ActiveQuestion>(qe => qe.ActivateQuestionId);
}
);
Что дало мне: свойство навигации «QuestionId» не может быть добавлено к типу объекта «ActiveQuestions_Questions», потому что свойство с тем же именем уже существует в типе сущности «ActiveQuestions_Questions».
Любой, кто может указать мне в правильном направлении?
Класс «Вопросы»
public class Question
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string QuestionId {get; set;}
[Required]
public string Text {get; set;}
}
Класс ActiveQuestion:
public class ActiveQuestion
{
private DateTime _lastUpdated = DateTime.Now;
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string ActivateQuestionId {get; set;}
public DateTime LastUpdated
{
get
{
return this._lastUpdated;
}
set
{
this._lastUpdated = value;
}
}
}
В EF Core определение составного PK с использованием KeyAttribute
не поддерживается, поэтому вы должны использовать свободный API для конфигурирования составного ПК.
build.HasKey(t => new {t.ActiveQuestionId, t.QuestionId});
Выше синтаксиса, который вы использовали в своем коде, является правильным способом определения составной PK. Для получения дополнительной информации см. Раздел «Ключи в документах».
Причина, по которой ваш код выходит из строя, - неправильная конфигурация отношений. API HasOne
/ WithOne
предполагается использовать с навигационными свойствами (свойствами, которые предназначены для других типов сущностей). В вашей конфигурации вы передаете примитивное свойство в вызове HasOne
. Поскольку в модели уже добавлено свойство с таким же именем (через соглашения и вызов HasKey
), он выдает исключение выше. Даже если бы они не были добавлены, было бы другое исключение. Вот ссылка на документы о том, как определять отношения, используя свободный API.