La domanda qui è come posso generare una chiave primaria composta composta da due chiavi esterne?
Ho provato:
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; }
}
Che mi dà: il tipo di entità 'ActiveQuestions_Questions' ha una chiave primaria composta definita con annotazioni di dati. Per impostare la chiave primaria composita, utilizzare l'API fluente.
Poi ho provato a usare l'api fluente nel modellista senza le annotazioni.
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);
}
);
Che mi ha dato: La proprietà di navigazione "QuestionId" non può essere aggiunta al tipo di entità "ActiveQuestions_Questions" perché esiste già una proprietà con lo stesso nome sul tipo di entità "ActiveQuestions_Questions".
Qualcuno che possa indicarmi la giusta direzione?
La classe Domande
public class Question
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string QuestionId {get; set;}
[Required]
public string Text {get; set;}
}
La classe 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;
}
}
}
In EF Core, la definizione di PK compositi utilizzando KeyAttribute
non è supportata, pertanto è necessario utilizzare API fluente per configurare PK compositi.
build.HasKey(t => new {t.ActiveQuestionId, t.QuestionId});
La sintassi sopra indicata nel codice è il modo corretto per definire il PK composito. Per maggiori informazioni vedi Keys in docs.
Il motivo per cui il tuo codice fallisce è la configurazione errata della relazione. HasOne
API HasOne
/ WithOne
devono essere utilizzate con le proprietà di navigazione (proprietà che si WithOne
ad altri tipi di entità). Nella tua configurazione stai passando una proprietà primitiva nella chiamata HasOne
. Poiché esiste già una proprietà con lo stesso nome aggiunta nel modello (tramite convenzioni e chiamata HasKey
), genera un'eccezione superiore. Anche se non fossero stati aggiunti, ci sarebbe stata un'eccezione diversa. Ecco il link ai documenti su come definire le relazioni usando l'API fluente.