简体   繁体   中英

EF Core 5.0 Adding many-to-many makes one-to-many unable to determine

I want to make use of the new many-to-many feature in ef core 5.0. https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key

My existing classes are

public class User : IdentityUser<int>
{
}

and

public class Notification
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Message { get; set; }
    public DateTime Created { get; set; }
    public DateTime Updated { get; set; }
    public User Creator { get; set; }
    public User Updater { get; set; }
    public Notification()
    {
    }
}

I want to add a many-to-many relation between them so the classes are

public class User : IdentityUser<int>
{
    public ICollection<Notification> Notifications { get; set; }
}

and

public class Notification
{
    //[...]
    public ICollection<User> Recipients { get; set; }
}

Now dotnet ef migrations add NotificationRecipients results in Unable to determine the relationship represented by navigation 'Notification.Recipients' of type 'ICollection<User>'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'. Unable to determine the relationship represented by navigation 'Notification.Recipients' of type 'ICollection<User>'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

After some research I found the [InverseProperty()] annotation so I added it to Notification.cs

public class Notification
{
    //[...]
    [InverseProperty("Notifications")]
    public ICollection<User> Recipients { get; set; }
}

The many-to-many now seems to be resolved but dotnet ef migrations add NotificationRecipients results in Unable to determine the relationship represented by navigation 'Notification.Creator' of type 'User'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'. Unable to determine the relationship represented by navigation 'Notification.Creator' of type 'User'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

Is there any Annotation I can add to Notification.Creator and Notification.Updater or any other way to define the one-to-many relations between User and Notification ?

I am using MSSQL as database.

Multiple relationships between two entities usually cannot be determined automatically and need configuration. Many things (and especially relationships related) in EF Core can only be configured only with fluent API.

So rather than looking for non existing or non intuitive data annotations, simply configure the desired relationships (at minimum - navigations properties and cardinality) fluently:

modelBuilder.Entity<Notification>(builder =>
{
    builder.HasOne(e => e.Creator).WithMany();
    builder.HasOne(e => e.Updater).WithMany();
    builder.HasMany(e => e.Recipients).WithMany(e => e.Notifications);
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM