Diciamo che ho due entità:
public class Customer
{
public int CustomerId { get; set; }
public Guid CustomerKey { get; set; }
public ICollection<Product> Products { get; set; }
}
public class Product
{
public int ProductId { get; set; }
public Guid CustomerKey { get; set; }
public string Name { get; set; }
}
1 cliente può avere molti prodotti, ma voglio vincolarli in base alla proprietà CustomerKey
. Ecco un esempio di dati di esempio:
CustomerId | CustomerKey
1 | {00000000-0000-0000-0000-111111111111}
2 | {00000000-0000-0000-0000-222222222222}
ProductId | Name | CustomerKey
1 | Product1 | {00000000-0000-0000-0000-111111111111}
2 | Product2 | {00000000-0000-0000-0000-111111111111}
3 | Product3 | {00000000-0000-0000-0000-222222222222}
Quindi il primo cliente ha i primi due prodotti e il secondo cliente ha l'ultimo prodotto. Ho provato a fare qualcosa come:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>().HasMany(m => m.Products);
}
Ma come faccio a specificare che voglio associarli a CustomerKey
?
È possibile, ma solo se la proprietà CustomerKey
(colonna) del Customer
è unica. Questo è il requisito di base di EF (requisito FK del database relazionale in realtà, ma EF Core supporta solo relazioni che possono essere rappresentate come vincoli FK del database relazionale), quindi se non lo è, allora ciò che stai chiedendo non è possibile.
L'API fluente per questo è il metodo HasPrincipalKey
:
Configura le proprietà univoche che questa relazione ha come target. Solitamente si chiama questo metodo solo se si desidera utilizzare una proprietà (s) diversa dalla chiave primaria come proprietà principale (s). Se la proprietà specificata (s) non è già un vincolo univoco (o la chiave primaria), verrà introdotto un nuovo vincolo univoco.
E naturalmente l'FK è configurato come al solito con HasForeignKey
.
Applicandolo al tuo modello:
modelBuilder.Entity<Customer>()
.HasMany(customer => customer.Products)
.WithOne() // no navigation property
.HasForeignKey(product => product.CustomerKey)
.HasPrincipalKey(customer => customer.CustomerKey);