Sto avendo problemi con la comprensione e l'implementazione di molte e molte repationship usando l'API FLuent e l'EF Core.
Ho esaminato questa domanda e impostato la mia relazione esattamente come quella, ma sto ottenendo il seguente errore:
Errore CS1061 'CollectionNavigationBuilder' non contiene una definizione per 'WithMany' e non è possibile trovare alcun metodo di estensione 'WithMany' che accetta un primo argomento di tipo 'CollectionNavigationBuilder' (ti manca una direttiva using o un riferimento assembly?)
Questa è la mia intenzione. Ho un cliente che ha molti lavori. Dovrei essere in grado di ottenere tutti i lavori collegati a quel cliente. EF dovrebbe creare la tabella di join sullo sfondo ...
Ecco le mie classi:
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 Ecco l'API Fluent che ho provato e dove ottengo l'errore su ".withMany"
modelBuilder.Entity<Client>()
.HasMany(p => p.Jobs)
.WithMany(p => p.clients)
.Map(m =>
{
m.MapLeftKey("ClientId");
m.MapRightKey("JobId");
m.ToTable("ClientJob");
});
Sto usando un modello di repository generico come da blog di Chris Sakell. Ecco il codice per il recupero dei client:
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();
e sto usando il codice generico come da:
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();
}
Come posso configurarlo in modo tale da poter recuperare i lavori anche utilizzando la proprietà includeproperty come indicato nella dichiarazione Allincluding sopra?
L'esempio dell'API di Fluent che stai tentando di implementare deriva da EF 6. La configurazione della relazione molti a molti è leggermente diversa in EF Core. Per cominciare, devi includere un'entità per rappresentare la tabella join / bridging:
public class ClientsJobs
{
public int ClientId { get; set; }
public int JobId { get; set; }
public Client Client { get; set; }
public Job Job { get; set; }
}
Quindi lo configuri in questo modo nel metodo 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);
}
Vedi di più qui: http://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration
Nota: è necessario includere le proprietà di navigazione per entrambe le estremità del rapporto nelle classi correlate, quindi è necessario aggiungere un Clients
proprietà alla Job
entità.