Связи Entity Framework с двумя внешними ключами - PullRequest
0 голосов
/ 03 мая 2018

У меня проблема с соединением двух таблиц в FluentAPI. На самом деле это смесь FluentAPI и аннотаций данных. Я посмотрел на этот вопрос , но он мне не помог. Я пробовал с Index, сочинил уникальные ключи.

В основном Foo является основной таблицей. Bar таблица не обязательна. Они связаны через две колонки. Пары key1 и key2 являются уникальными. Думайте об этом как о родительско-дочерних отношениях с ограничением, что 1 родитель может иметь только 1 ребенка:

Сущности данных выглядят так:

[Table("foo")]
public class Foo
{
    [Key]
    [Column("pk", TypeName = "int")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int FooId { get; set; }

    [Column("key1", TypeName = "int")]
    public int Key1 { get; set; }
    [Column("key2", TypeName = "int")]
    public int Key2 { get; set; }

    public Bar Bar { get; set; }
}

[Table("bar")]
public class Bar
{
    [Key]
    [Column("key1", TypeName = "int", Order = 1)]
    public int Key1 { get; set; }
    [Key]
    [Column("key2", TypeName = "int", Order = 2)]
    public int Key2 { get; set; }

    public Foo Foo { get; set; }
}    

Вот как я пытался их соединить:

modelBuilder.Entity<Bar>().HasRequired(p => p.Foo).WithOptional(p => p.Bar);

Что не так? Bar Требуется Foo. Foo имеет опционально Bar. <--- этого должно быть вполне достаточно, потому что <code>Foo имеет столбцы, названные точно так же, как первичные ключи в Bar. Но это не работает.

Итак, я попытался указать внешние ключи:

modelBuilder.Entity<Bar>().HasRequired(p => p.Foo).WithOptional(p => p.Bar).Map(p => p.MapKey(new[] { "key1", "key2" }));

Там написано:

"Количество указанных столбцов должно соответствовать номеру первичного ключа Столбцы "

Whaaaat? как? Как так? Гм ..

Я тоже пробовал:

modelBuilder.Entity<Bar>().HasIndex(table => new { table.Key1, table.Key2 });  

Итак, мои вопросы:

  1. Почему мое решение не работает? У меня есть комплексный ключ, указанный

  2. Как мне сделать это?

1 Ответ

0 голосов
/ 04 мая 2018

Это будет немного сложно, и я могу ошибаться, но из моего опыта отношения EntityFramework не работают таким образом. Мне кажется, что если Foo требуется , а Bar необязательно , то у каждого бара должен быть способ уникального присоединения к Foo, основанный на значении pk Foo .

То есть, бар должен быть определен как:

[Table("bar")]
public class Bar
{
    [Key]
    [Column("key1", TypeName = "int", Order = 1)]
    public int Key1 { get; set; }
    [Key]
    [Column("key2", TypeName = "int", Order = 2)]
    public int Key2 { get; set; }
    public int FooId { get; set; }

    public Foo Foo { get; set; }
}    

Затем вам нужно будет использовать этот FooId при описании отношений, а не составной ключ, содержащийся в Bar. EntityFramework всегда требовал от меня присоединения ко всему первичному ключу родительского POCO, который должен быть внешним ключом дочернего POCO. Вы все еще можете присоединиться через ключ ребенка в запросах LINQ.

...