Ho le seguenti classi:
public class InvoiceLine
{
public Guid Id { get; set; }
public int LineNumber { get; set; }
public List<ProductCode> ProductCodes { get; set; }
}
public class ProductCode
{
public string Category { get; set; }
public string Value { get; set; }
}
Nel caso di ProductCode
la Category
e il Value
sono insieme la chiave primaria.
Ho impostato questo in DbContext
:
modelBuilder.Entity<ProductCode>()
.HasKey(pc => new { pc.Category, pc.Value });
One InvoiceLine
può avere molti codici prodotto ma un codice prodotto può essere utilizzato per vari InvoiceLine
.
In EF Core devo creare un'entità join con gli id e i siti:
public class InvoiceLineProductCode
{
public Guid InvoiceLineId { get; set; }
public InvoiceLine InvoiceLine { get; set; }
public ProductCode ProductCode { get; set; }
}
Come posso impostare ProductCodeId
?
L'aggiunta di FK compositi è simile all'aggiunta di FK a colonna singola.
Inizia aggiungendo la (e) colonna (e) PK dell'entità referenziata:
public class InvoiceLineProductCode
{
public Guid InvoiceLineId { get; set; }
public InvoiceLine InvoiceLine { get; set; }
public string ProductCodeCategory { get; set; } // <--
public string ProductCodeValue { get; set; } // <--
public ProductCode ProductCode { get; set; }
}
Quindi definire come sempre normale l'entità di join composita PK:
modelBuilder.Entity<InvoiceLineProductCode>()
.HasKey(e => new { e.InvoiceLineId, e.ProductCodeCategory, e.ProductCodeValue });
Inoltre, non dimenticare di modificare il tipo di proprietà di navigazione raccolta Invoice
:
public class InvoiceLine
{
public Guid Id { get; set; }
public int LineNumber { get; set; }
public List<InvoiceLineProductCode> ProductCodes { get; set; } // <--
}
e dato che i nomi corrispondono alle convenzioni EF Core, hai finito. In caso contrario, la configurazione completa della relazione ProductCode
-> InvoiceLineProductCode
sarebbe la seguente:
modelBuilder.Entity<InvoiceLineProductCode>()
.HasOne(e => e.ProductCode)
.WithMany()
.HasForeignKey(e => new { e.ProductCodeCategory, e.ProductCodeValue })
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);