Sto cercando di creare un modello che abbia un'entità Customer
con due riferimenti alle entità Address
: Address
BillingAddress
e Address
ShippingAddress
.
Cliente
public class Customer
{
public Guid CustomerId { get;set;}
public Guid? BillingAddressId { get; set; }
public Address BillingAddress { get; set; }
public Guid? ShippingAddressId { get; set; }
public Address ShippingAddress { get; set; }
}
Indirizzo
public class Address
{
public Guid AddressId { get; set; }
public Customer Customer { get; set; }
public Guid CustomerId { get; set; }
}
OnModelCreating
modelBuilder.Entity<Address>(eb =>
{
eb.HasOne(e => e.Customer).WithOne(o => o.BillingAddress).OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity<Address>(eb =>
{
eb.HasOne(e => e.Customer).WithOne(o => o.ShippingAddress).OnDelete(DeleteBehavior.Cascade);
});
Ottengo il seguente errore quando provo a creare la migrazione:
Cannot create a relationship between 'Customer.ShippingAddress' and 'Address.Customer', because there already is a relationship between 'Customer.BillingAddress' and 'Address.Customer'. Navigation properties can only participate in a single relationship.
Sto provando a configurare il modello in modo che quando il cliente viene cancellato anche gli indirizzi di riferimento vengano cancellati. Mi piacerebbe poterlo fare senza caricare gli indirizzi nel contesto e fare affidamento sul database a cascata.
Tratto da qui, sezione [InverseProperty]: https://docs.microsoft.com/en-us/ef/core/modeling/relationships
È possibile utilizzare le Annotazioni dati per configurare il modo in cui le proprietà di navigazione sulle entità dipendenti e principali si accoppiano. Questo in genere viene eseguito quando esiste più di una coppia di proprietà di navigazione tra due tipi di entità.
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int AuthorUserId { get; set; }
public User Author { get; set; }
public int ContributorUserId { get; set; }
public User Contributor { get; set; }
}
public class User
{
public string UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[InverseProperty("Author")]
public List<Post> AuthoredPosts { get; set; }
[InverseProperty("Contributor")]
public List<Post> ContributedToPosts { get; set; }
}