2017-02-20 9 views
0

У меня возникли проблемы с пониманием и внедрением многих-многих репликации с использованием API-интерфейсов FLuent и EF Core.EF Core для многих конфигураций, не работающих с Fluent API

Я посмотрел на this вопрос и установить свои отношения именно так, как это, но я получаю следующее сообщение об ошибке:

Error CS1061 'CollectionNavigationBuilder' does not contain a definition for 'WithMany' and no extension method 'WithMany' accepting a first argument of type 'CollectionNavigationBuilder' could be found (are you missing a using directive or an assembly reference?)

Это мое намерение. У меня есть клиент, у которого много рабочих мест. Я должен иметь возможность получить все задания, связанные с этим клиентом. EF должен создать таблицу соединения в фоновом режиме ...

Вот мои классы:

public class Client : IEntityBase 
{ 
    public int Id { get; set; } 

    public int? JobId { get; set; } 
    public ICollection<Job> Jobs { get; set; } 
} 

public class Job : IEntityBase 
{ 
    public int Id { get; set; } 
} 

//my interface 
public interface IEntityBase 
{ 
    int Id { get; set; } 
} 

EDIT Вот Fluent API я попробовал, и где я получаю ошибку на «.withMany»

 modelBuilder.Entity<Client>() 
      .HasMany(p => p.Jobs) 
      .WithMany(p => p.clients) 
      .Map(m => 
      { 
       m.MapLeftKey("ClientId"); 
       m.MapRightKey("JobId"); 
       m.ToTable("ClientJob"); 
      }); 

Я использую общий шаблон хранилища согласно блогу Криса Сакелла. Вот код для извлечения клиентов:

 IEnumerable<Client> _clients = _clientRepository 
      .AllIncluding(s => s.Creator, s => s.Jobs, s => s.State) 
      .OrderBy(s => s.Id) 
      .Skip((currentPage - 1) * currentPageSize) 
      .Take(currentPageSize) 
      .ToList(); 

и я использую общий код в соответствии с:

public virtual IEnumerable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties) 
    { 
     IQueryable<T> query = _context.Set<T>(); 
     foreach (var includeProperty in includeProperties) 
     { 
      query = query.Include(includeProperty); 
     } 
     return query.AsEnumerable(); 
    } 

Как настроить это так, я могу получить рабочие места, а также с помощью includeproperty согласно заявление Allincluding выше?

+0

Взгляните на документацию EF Core - [Отношения] (https://docs.microsoft.com/en-us/ef/core/modeling/relationships) - ** Много-ко-многим ** –

ответ

0

Вы должны добавить свойство Клиентов к классу работы тоже:

public class Job : IEntityBase 
{ 
    public int Id { get; set; } 
    public ICollection<Client> Clients{ get; set; } 
} 

Тогда все должно быть в порядке.

+0

Все еще получая ошибка «CollectionNavigationBuilder не содержит определения для« withMany »даже после того, как я добавил это ... – si2030

0

Пример Fluent API, который вы пытаетесь реализовать, поступает из EF 6. Конфигурация отношений Many-to-Many немного отличается в EF Core. Для начала, необходимо включить объект для представления присоединиться/мостовую таблицу:

public class ClientsJobs 
{ 
    public int ClientId { get; set; } 
    public int JobId { get; set; } 
    public Client Client { get; set; } 
    public Job Job { get; set; } 
} 

Затем настроить его, как это в методе OnModelCreating:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ClientsJobs>() 
     .HasKey(x => new { x.ClientId, x.JobId }); 

    modelBuilder.Entity<ClientsJobs>() 
     .HasOne(x => x.Client) 
     .WithMany(y => y.Jobs) 
     .HasForeignKey(y => y.JobId); 

    modelBuilder.Entity<ClientsJobs>() 
     .HasOne(x => x.Job) 
     .WithMany(y => y.Clients) 
     .HasForeignKey(y => y.ClientId); 
} 

Подробнее об этом здесь: http://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration

Примечание: вы сделать необходимо включить навигационные свойства для обоих концов отношений в соответствующих классах, поэтому вам нужно добавить Clients свойство вашей Job объект.

Смежные вопросы