Установить составной ключ в таблице только с отношениями «один к нулю или один»

Используя EF6, я пытаюсь определить следующее отношение A(1)---(0..1)C(0..1)---(1)B ((x) - это мощность). Затем таблица C будет использовать составной ключ из двух внешних ключей из A и B.

// Other properties are omitted for brevity
public class A
{
    public int Id { get; set; }
    public virtual C C { get; set; }
}

public class B
{
    public int Id { get; set; }
    public virtual C C { get; set; }
}

public class C
{
    public virtual A A { get; set; }
    public virtual B B { get; set; }
}

Это свободный API, который я придумал.

public class C : EntityTypeConfiguration<C>
{
    public C()
    {
        // Primary Key
        this.HasKey(t => new { t.A, t.B}); // This is the problem

        // Relationships
        this.HasRequired(t => t.A)
            .WithOptional(t => t.C);
            // cannot use .HasForeignKey

        this.HasRequired(t => t.B)
            .WithOptional(t => t.C);
            // cannot use .HasForeignKey
    }
}

HasKey(t => new { t.A, t.B}) не разрешено, и требуется скалярное свойство, обычно устанавливаемое с .HasForeignKey. Однако, поскольку это один на один, я не могу его использовать.

Что делать?


person Snæbjørn    schedule 27.02.2014    source источник


Ответы (1)


Если указано A->C.WithOptional, EF предполагает, что таблицы A и C имеют одинаковый PK.

Я бы рекомендовал иметь в виду 0..1/комментарии и указывать .WithMany().HasForeignKey(..) как в ссылках A->C, так и в ссылках B->C.

person Ben    schedule 27.02.2014
comment
Кажется, я пытаюсь сделать что-то, что не поддерживается EF6. Я думал о чем-то подобном. - person Snæbjørn; 27.02.2014