Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EF Code First, map two navigation properties to the same object type

If I have a User class that has these properties:

    public Guid UserPreferenceId { get; set; }
    public virtual DefaultUserPreference UserPreference { get; set; }

    public Guid SecondaryUserPreferenceId { get; set; }
    public virtual DefaultUserPreference SecondaryUserPreference { get; set; }

How can I get this to make via fluent API? When I try to run this it says:

Introducing FOREIGN KEY constraint on table 'Users' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

I've seen a few of these questions but they always involve one single navigation property and one collection. Also the relationship is unidirectional, but it could be bidirectional if it had to be, not sure if that matters.

like image 735
SventoryMang Avatar asked Jun 19 '13 20:06

SventoryMang


1 Answers

Entity Framework creates relationships with Cascade Delete on by default. Creating two relationships from one entity to another type tries to create two cascade-delete relationships, which the database will throw the error you saw for.

Use the Code-First Fluent Configuration to remove the Cascade Delete on one or both of the relationships:

modelBuilder.Entity<User>()
    .HasOptional(u => u.UserPreference)
    .WithMany()
    .WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
    .HasOptional(u => u.SecondaryUserPreference)
    .WithMany()
    .WillCascadeOnDelete(false);
like image 83
Richard Avatar answered Oct 29 '22 17:10

Richard