首页 > 解决方案 > EFCore:无法确定导航属性表示的关系

问题描述

我尝试设置一个 UserUserFavourite 类。如果用户关注用户或被用户关注,它将存储用户之间的关系。

为此,我创建了一个类,如下所示:

 [Table("UserUserFavorite")]
public class UserUserFavorite
{
    [ForeignKey("User1")]
    public long UserId1 { get; set; }

    public User User1 { get; set; }

    [ForeignKey("User2")]
    public long UserId2 { get; set; }
    public User User2 { get; set; }
}

user1 正在关注 user2。

在我的 UserClass 中,我有两个属性:

`public List<UserUserFavorite> Followers{ get; set; }
 public List<UserUserFavorite> Followings{ get; set; }`

在我的 dbcontext 中,我有:

modelBuilder.Entity<UserUserFavorite>().HasKey(sc => new { sc.UserId1, sc.UserId2 });

然后我生成我的迁移我有错误:

无法确定“用户”类型的导航属性“UserUserFavorite.User1”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。

怎么了?

标签: c#asp.net-coreentity-framework-core

解决方案


您需要设置DeleteBehavior.RestrictOnModelCreating.

这里和你的需求是一样的,可以参考这个

我根据您的代码创建了一个演示:

 public class UserUserFavorite
    {
        public long UserId1 { get; set; }

        public User User1 { get; set; }

        public long UserId2 { get; set; }

        public User User2 { get; set; }
    }

    public class User
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public UserUserFavorite userUserFavorite1 { get; set; }
        public UserUserFavorite userUserFavorite2 { get; set; }
    }

OnModelCreating:

 protected override void OnModelCreating(ModelBuilder modelBuilder)
        {  
            modelBuilder.Entity<UserUserFavorite>().HasKey(sc => new { sc.UserId1, sc.UserId2 });
            modelBuilder.Entity<UserUserFavorite>()
                   .HasOne(m => m.User1)
                   .WithOne(t => t.userUserFavorite1)
                   .HasForeignKey<UserUserFavorite>(m => m.UserId1)
                   .OnDelete(DeleteBehavior.Restrict); 
            modelBuilder.Entity<UserUserFavorite>()
                        .HasOne(m => m.User2)
                        .WithOne(t => t.userUserFavorite2)
                        .HasForeignKey<UserUserFavorite>(m => m.UserId2)
                        .OnDelete(DeleteBehavior.Restrict); 
}

推荐阅读