EF Core 2.0 Multiple one to one relationships



I am trying to create a model that has a Customer entity with two references to Address entities: BillingAddress and ShippingAddress.


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; }


public class Address
    public Guid AddressId { get; set; }

    public Customer Customer { get; set; }
    public Guid CustomerId { get; set; }


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);

I get the following error when trying to create the migration:

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.

I'm trying to configure the model so that when the Customer is deleted the referenced Addresses are deleted as well. I would like to be able to do this without loading the Addresses into the Context and relying on the database to cascade.

3/30/2018 6:21:56 AM

Popular Answer

Taken straight from here, section [InverseProperty]: https://docs.microsoft.com/en-us/ef/core/modeling/relationships

You can use the Data Annotations to configure how navigation properties on the dependent and principal entities pair up. This is typically done when there is more than one pair of navigation properties between two entity types.

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; }

    public List<Post> AuthoredPosts { get; set; }

    public List<Post> ContributedToPosts { get; set; }
4/2/2018 9:27:52 AM

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow