C # EF-отношение 0..1-1 между двумя объектами, когда у зависимого есть только внешний ключ и нет первичного ключа - PullRequest
0 голосов
/ 01 марта 2019

Как установить EF-отношение между двумя объектами, в которых первый (основной) объект имеет первичный ключ, а второй (зависимый) не имеет PK, только внешний ключ - для первого объекта.

public class Dogovor
{
    public int Key { get;set; }
    public string Name { get;set; }
    public virtual DogovorStatus Status { get; set; }
}

public class DogovorStatus
{
    public int StatusKey { get; set; }

    //public int DogovorKey { get; set; }  // - no need, because this key is pointed in DogovorConfiguration        
}

DB tables

Я пытался сделать это, но безуспешно:

public class DogovorConfiguration : EntityTypeConfiguration<Dogovor>
{
    HasKey(v => v.Key);
    Property(v => v.Key)
        .IsRequired()
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
        .HasColumnName("DG_Key");
    Property(v => v.Name).
        .IsRequired()
        .HasColumnName("DG_Name");

    HasOptional(v => v.Status)
        .WithRequired()
        .Map(v => v.MapKey("ST_DGKey"));
}

public class DogovorStatusConfiguration : EntityTypeConfiguration<DogovorStatus> {

HasKey(v => v.StatusKey);  // not unique - logical error
Property(v => v.StatusKey)
    .IsRequired()
    .HasColumnName("ST_StatusKey");
}

Я не могу добавить PK в DogovorStatus.Как правильно указать такой тип EF-отношений?

EF 6.0

1 Ответ

0 голосов
/ 01 марта 2019

Также добавьте свойство навигации в класс DogovorStatus:

public class DogovorStatus
{
    public int StatusKey { get; set; }
    public virtual Dogovor Dogovor { get; set; }
}

Затем настройте конфигурации:

public class DogovorStatusConfiguration : EntityTypeConfiguration<DogovorStatus> 
{
    HasKey(v => v.StatusKey);
}

public class DogovorConfiguration : EntityTypeConfiguration<Dogovor>
{
    HasKey(v => v.Key);
    Property(v => v.Key)
        .IsRequired()
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
        .HasColumnName("DG_Key");

    Property(v => v.Name)
        .IsRequired()
        .HasColumnName("DG_Name");

    HasOne(v => v.Status)
        .WithOne(s => s.Dogovor)
        .HasForeignKey<DogovorStatus>(s => s.StatusKey);
}

См. Также справку Настройка отношений один-к-одному

...