Недостаточное сопоставление в Entity Framework с плавным API (сначала база данных) в отношениях 1: 1

У меня есть эти классы, и мне нужно сопоставить их с отношением 1: 1, но у меня еще нет хороших знаний для свободного API, и я получил эту ошибку во время выполнения (отладка):

"erro 3015: Problema nos fragmentos do mapeamento a partir das linhas 6, 22, 191: Restrição de chave estrangeira 'OperadorModel_OpCadastros1' от tabela OperadorModel (OpCadastros1_OperadorId) для tabela OperadorModel (id):: Mapeamento insuficiente: a chave ser mapeadadeve para algum AssociationSet ou EntitySetsучастники де ума associação де chave estrangeira no lado ceptual."

Что-то типа:

«Ошибка 3015: Проблема в сопоставлении фрагментов из строк 6, 22, 191: ограничение внешнего ключа «OperadorModel_OpCadastros1» таблицы OperadorModel (OpCadastros1_OperadorId) для таблицы OperadorModel (id) :: Недостаточное сопоставление: внешний ключ должен быть сопоставлен для некоторых наборов объектов AssociationSet или участие в ассоциации внешнего ключа в концептуальном».

Как решить эту проблему?

Код ниже. К счастью, и извините за мой плохой английский.

public class OperadorModel
{
    public int OperadorId { get; set; }

    public string Login { get; set; }

    public bool TiraMenu { get; set; }

    public virtual OpCadastros1Model OpCadastros1 { get; set; }
}

public class OpCadastros1Model
{
    public int OperadorId { get; set; }

    public virtual OperadorModel Operador { get; set; }

    #region Apoio

    [Column("cad_apoio_ac")]
    [Display(Description = "Acessar", GroupName = "Cadastros", Name = "Laboratórios de Apoio")]
    public bool AcApoio { get; set; }

    [Column("cad_apoio_ad")]
    [Display(Description = "Adicionar", GroupName = "Cadastros", Name = "Laboratórios de Apoio")]
    public bool AdApoio { get; set; }

    [Column("cad_apoio_md")]
    [Display(Description = "Modificar", GroupName = "Cadastros", Name = "Laboratórios de Apoio")]
    public bool MdApoio { get; set; }

    [Column("cad_apoio_co")]
    [Display(Description = "Consultar", GroupName = "Cadastros", Name = "Laboratórios de Apoio")]
    public bool CoApoio { get; set; }

    [Column("cad_apoio_ex")]
    [Display(Description = "Excluir", GroupName = "Cadastros", Name = "Laboratórios de Apoio")]
    public bool ExApoio { get;  set; }

    #endregion
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Entity<OperadorModel>()
        .HasKey(op => op.OperadorId);

    modelBuilder.Entity<OpCadastros1Model>()
        .HasKey(cad => cad.OperadorId)
        .HasRequired(cad => cad.Operador)
        .WithRequiredPrincipal(cad => cad.OpCadastros1);

    modelBuilder.Entity<OperadorModel>().ToTable("operador", "public");
    modelBuilder.Entity<OpCadastros1Model>().ToTable("operador", "public");
}

person GustavoAdolfo    schedule 30.08.2013    source источник
comment
Спасибо за ваше издание @marc_s   -  person GustavoAdolfo    schedule 30.08.2013


Ответы (1)


Я думаю, что ваша проблема здесь заключается в необходимости указать ключ для явного использования, поскольку соглашение о том, как они должны быть названы, довольно строгое (ожидается столбец с именем ID - я думаю), и что-то вроде это должно решить проблему:

modelBuilder.Entity<OperadorModel>()
    .HasKey(op => op.OperadorId)
    .HasOptional(op => op.OpCadastros1)
    .Map(f => f.MapKey("OperadorID"));

После того, как я написал, что я и искал то, что, вероятно, было вашим идентификатором, я понял, что столбец идентификатора имеет одно и то же имя в модели для обоих объектов...

person Matthew    schedule 30.08.2013
comment
Да, @Mattew, идентификатор одинаков для обоих классов, и на них ссылаются для какой-то таблицы. - person GustavoAdolfo; 30.08.2013
comment
Решает ли ваша проблема явное указание имени столбца, как указано выше? - person Matthew; 30.08.2013
comment
@GustavoAdolfo Обратите внимание, что в свободном коде выше это имя столбца в базе данных, а не имя свойства модели, если они не совпадают. - person Matthew; 30.08.2013
comment
В базе данных имя столбца — id; ссылка для него на модель — OperadorId. - person GustavoAdolfo; 30.08.2013
comment
Таким образом, исходя из этого, текст в "" будет ID, а не OperadorID. - person Matthew; 31.08.2013