Невозможно создать составной первичный ключ в EF Code First - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь выполнить первую миграцию нового проекта на EF, но продолжаю получать исключение, которое не имеет смысла.

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

public class AlunoAcessaArquivoMapeamento : EntityTypeConfiguration<AlunoAcessaArquivo> {
    public AlunoAcessaArquivoMapeamento() {
        ToTable(Regex.Replace(typeof(AlunoAcessaArquivo).Name, "([^A-Z])([A-Z])", "$1_$2").ToLower());
        HasKey(e => new {e.AlunoId, e.ArquivoId});
        HasRequired(a => a.Aluno).WithMany(a => a.AlunosAcessaArquivos).HasForeignKey(a => a.AlunoId);
        HasRequired(a => a.Arquivo).WithMany(a => a.AlunosAcessaArquivos).HasForeignKey(a => a.ArquivoId);
    }
}

Класс, который он настраивает, это тот, который представляет собой простую таблицу отношений «многие ко многим»:

public class AlunoAcessaArquivo : EntidadeBase {

    public virtual Aluno Aluno { get; set; }

    public virtual Arquivo Arquivo { get; set; }

    public long AlunoId;
    public long ArquivoId;
}

Когда я пытаюсь Add-Migration, я получаю исключение:

System.InvalidOperationException: выражение свойств 'e => new <> f__AnonymousType0`2 (AlunoId = e.AlunoId, ArquivoId = e.ArquivoId) 'недействителен.Выражение должно представлять свойство: C #: 't => t.MyProperty' VB.Net: 'Function (t) t.MyProperty'.При указании нескольких свойств используйте анонимный тип: C #: 't => new {t.MyProperty1, t.MyProperty2}' VB.Net: 'Function (t) New With {t.MyProperty1, t.MyProperty2}'.

Это исключение не имеет никакого смысла.Обратите внимание, что я настраиваю свой первичный ключ во четвертой строке первого примера кода, и он явно следует формату анонимного типа, указанному в исключении, поэтому я застрял с этим.

Замечание: я знаю, что мой код содержитпортугальский текст, который я могу перевести на английский, но только если это строго необходимо.

1 Ответ

2 голосов
/ 08 апреля 2019

Ваши AlunoId и ArquivoId в AlunoAcessaArquivo являются полями, а не свойствами. Это проблема. Сделайте их свойства следующим образом:

public class AlunoAcessaArquivo : EntidadeBase {

    public virtual Aluno Aluno { get; set; }

    public virtual Arquivo Arquivo { get; set; }

    public long AlunoId { get; set; } // <-- You missed { get; set; }
    public long ArquivoId { get; set; } // <-- You missed { get; set; }
}
...