2

Сначала я создаю базу данных, используя код EF6, и изо всех сил пытаюсь создать отношения «один ко многим», используя таблицу переходов.Взаимодействие от одного до другого с помощью таблицы соединений с использованием кода Entity Framework сначала

Вот пример того, что я пытаюсь сделать:

Foo объекты могут содержать любое количество (0-п) Bar субъектов, однако Bar сущности не обязательно принадлежат к Foo. Я хочу, чтобы другой тип объекта также содержал один или несколько Bar, поэтому важно, чтобы Bar не содержал внешний ключ его родителя.

Так присоединиться к таблице будет выглядеть примерно так:

Name  | FooBar 
------------|------- 
Primary Key | BarID 
Key   | FooID 

Так что, если мы создаем объекты следующим образом:

public class Foo 
{ 
    public long ID { get; set; } 
    public ICollection<Bar> Bars { get; set; } 
} 

public class Bar 
{ 
    public long ID { get; set; } 
} 

А затем настроить их:

public class FooConfiguration : EntityTypeConfiguration<Foo> 
{ 
    HasKey(p => p.ID); 
    HasMany(p => p.Bars) 
    .WithRequired() 
    .Map(m => { 
     m.ToTable("FooBar"); 
     m.MapKey("FooKey"); 
    }); 
} 

Но это приводит к следующему исключению:

An exception of type 'System.InvalidOperationException' occurred in mscorlib.dll but was not handled in user code. Additional information: The specified table 'FooBar' was not found in the model. Ensure that the table name has been correctly specified.

К сожалению, я не уверен, что это значит - мне нужно создать отдельный объект FooBar?

Как настроить эти объекты так, чтобы таблица соединений была правильно создана?

Спасибо!

+0

'ребенок лицо принадлежит ко многим различным родительском entities', если родитель может иметь несколько детей вы в От многих до многих, а afaik это его единственный случай, в котором вы нуждаетесь/имеете таблицу соединений в EF – tschmit007

+0

. Я должен был быть более ясным - дочерняя сущность используется многими разными объектами, но это, в частности, отношение одного родителя ко многим детям которые я изо всех сил пытаюсь создать. –

+0

Вы имеете в виду, что у ребенка может быть или нет один родитель, но может быть в (другом) отношении со многими объектами типа Parent? – tschmit007

ответ

2

Если вы не хотите хранить ключ foo в своем bar, тогда вам нужно найти множество отношений. То, как вы будете действовать, как отношение от одного к другому, зависит от вашей реализации после, есть еще способ убедиться, что bar имеет только один foo, но для EF6, чтобы сделать таблицу соединений, единственный способ пойти - это много для многих отношений.

+0

Спасибо, настраивая это как отношение многих к многим, ведет себя так, как я его намеревался, и для моих целей он не вызывает никаких проблем. –

2

Извините, что восстановить эту тему, но я хотел бы поделиться утилитой, которую я создал для обработки WebApi, у которой было много примеров такого же отношения. У нас есть несколько бизнес-объектов, каждый из которых имеет отношения к EventHistory, сообщениям, файлам и т. Д., И это было беспорядочно отслеживать все функции FluentAPI. Вот что я придумал:

/// <summary> 
    /// Maps a many-to-many relationship that can only be navigated from TSource to TTarget. 
    /// </summary> 
    /// <typeparam name="TSource">Source type that can navigate to TTarget.</typeparam> 
    /// <typeparam name="TTarget">Target type that has no direct link back to TSource.</typeparam> 
    /// <param name="modelBuilder">An instance of DbModelBuilder</param> 
    /// <param name="expr">Lambda expression specifying the navigation property for this relationship from TSource to TTarget.</param> 
    /// <param name="leftKey">Optional argument to override the foreign key to TSource</param> 
    /// <param name="rightKey">Optional argument to override the foreign key to TTarget</param> 
    public static void MapDirectionalManyToMany<TSource, TTarget>(DbModelBuilder modelBuilder, Expression<Func<TSource, ICollection<TTarget>>> expr, string tableName = null, string leftKey = null, string rightKey = null) 
     where TSource : class 
     where TTarget : class { 

     modelBuilder.Entity<TSource>() 
      .HasMany(expr) 
      .WithMany() 
      .Map(m => { 
       m.MapLeftKey(leftKey ?? typeof(TSource).Name + "Id"); 
       m.MapRightKey(rightKey ?? typeof(TTarget).Name + "Id"); 
       m.ToTable(tableName ?? typeof(TSource).Name + typeof(TTarget).Name); 
      }); 

    } 

И я применяю отношения вроде так:

ModelUtils.MapDirectionalManyToMany<MyResourceModel, SharedHistoryModel>(modelBuilder, x => x.History); 
ModelUtils.MapDirectionalManyToMany<OtherResourceModel, SharedHistoryModel>(modelBuilder, x => x.History, "renamed_history"); 
Смежные вопросы