Questo è lo scenario: ho una tabella prodotti e una tabella categorie. La relazione è molti-a-molti: una categoria può avere 1 o più prodotti .... e un prodotto può essere in 1 o più categorie ...
La mappatura Code-First ha questo aspetto ....
public class Product
{
//...additional properties...
public virtual ICollection<Category> AssociatedCategories {get; set;}
}
public class Category
{
//...additional properties...
public virtual ICollection<Product> AssociatedProducts {get; set;}
}
Ora, sotto la copertura, il framework di entità creerà una tabella di join denominata ProductCategory con colonne ProductID e CategoryID. È fantastico....
Ecco la cosa però, ho bisogno di introdurre un ordinamento ... fondamentalmente solo un indice di posizionamento cardinale, ma questo numero esiste solo nella parte nella relazione in cui prodotto e categoria si incontrano. Ad esempio, un prodotto X potrebbe avere un valore di ordinamento di "5" nella categoria Y, ma che alcuni prodotti - X - potrebbero avere un valore di ordinamento diverso, ad esempio 10, nella categoria Z.
Naturalmente, potrei creare un'entità specifica per questo tipo di cose ... ma richiederebbe una nuova tabella ... ci sarebbero 3 colonne per l'ID di categoria, l'ID di prodotto e l'ordinamento. Quello che mi piacerebbe davvero essere in grado di fare è entrare nella tabella che il framework delle entità ha già fatto ... già terrà traccia degli ID dei prodotti e degli ID delle categorie nella tabella dei join .... c'è un modo per fare uso della tabella che esiste già?
È necessario creare un'entità specifica per la tabella di join per fare ciò.
public class Product
{
//...additional properties...
public virtual ICollection<ProductCategoryXref> AssociatedCategories {get; set;}
}
public class Category
{
//...additional properties...
public virtual ICollection<ProductCategoryXref> AssociatedProducts {get; set;}
}
public class ProductCategoryXref
{
public int ProductId { get; set; }
public int CategoryId { get; set; }
public int SortOrder { get; set; }
// Additional Columns...
public virtual Product Product { get; set; }
public virtual Category Category { get; set; }
}
Se si sta utilizzando l'API Fluent per configurare le entità, sarà simile a questa:
public class ProductCategoryXrefMap : EntityTypeConfiguration<ProductCategoryXref>
{
ProductCategoryXrefMap()
{
HasKey(pk => new { pk.ProductId, pk.CategoryId });
HasRequired(p => p.Product).WithMany(p => p.AssociatedCategories).HasForeignKey(fk => fk.ProductId);
HasRequired(p => p.Category).WithMany(p => p.AssociatedProducts).HasForeignKey(fk => fk.CategoryId);
ToTable("ProductCategoryXref");
}
}