Pourquoi l'entité crée-t-elle un champ clé alors qu'il est déjà défini ?

Aug 20 2020

J'ai plusieurs modèles de domaine associés qui déclenchent l'exception SqlException: Invalid column name 'ChecklistTemplate_Id' .

Mon modèle de domaine ressemble à :

public class Assignment
{
    public long Id { get; set; }
    public long ChecklistId { get; set; }
    public DateTime InspectionDate { get; set; }
    public long JobId { get; set; }
    public Guid? EmployeeId { get; set; }
    // TODO: Make the completion a nullable date time in the database and here
    public DateTime CompletionDate { get; set; }

    public virtual Job Job { get; set; }
    public virtual Checklist Checklist { get; set; }
    public virtual IList<Image> Images { get; set; }
    public virtual IList<Attachment> Attachments { get; set; }
    public virtual IList<Equipment> Equipments { get; set; }
}

Ma classe EntityTypeConfiguration ressemble à :

internal class AssignmentConfiguration : EntityTypeConfiguration<Assignment>
{
    public AssignmentConfiguration()
    {
        ToTable("Assignment");

        HasKey(k => k.Id);

        Property(a => a.ChecklistId)
            .IsRequired();
        Property(a => a.CompletionDate)
            .IsOptional();
        Property(a => a.EmployeeId)
            .IsOptional();
        Property(a => a.Id)
            .IsRequired();
        Property(a => a.InspectionDate)
            .IsRequired();
        Property(a => a.JobId)
            .IsRequired();

        HasRequired(a => a.Job)
            .WithMany(a => a.Assignments)
            .HasForeignKey(a => a.JobId);

        HasRequired(a => a.Checklist)
            .WithOptional(a => a.Assignment);

        HasMany(a => a.Images)
            .WithRequired(a => a.Assignment)
            .HasForeignKey(a => a.InspectionId);
    }
}

Le modèle de domaine Checklist a une propriété de navigation ChecklistTemplate avec la jointure :

HasMany(a => a.CheckLists)
            .WithRequired(a => a.ChecklistTemplate)
            .HasForeignKey(a => a.ChecklistTemplateId);

Il y a un à un entre l'affectation et la liste de contrôle, comme indiqué dans la configuration de l'entité d'affectation.

Et oui, nous incluons la configuration dans le DBContext.

De plus, j'ai regardé Entity Framework 6 crée une colonne Id même si une autre clé primaire est définie et cela ne semble pas s'appliquer.

Réponses

Noname Aug 20 2020 at 03:23

Je n'ai pas de réponse satisfaisante à cela, mais j'ai eu beaucoup de problèmes avec ef6. C'est parce qu'il y a une navigation qui n'est pas définie ou mal définie. Donc ef6 le crée à la volée sur des classes proxy et vous pleurez pendant des heures. J'espère que vous trouverez le problème bientôt.

Et la navigation que vous avez indiquée est un-à-plusieurs. Faire attention.