Asp.net 如何在同一个表中定义两个FK?

Asp.net 如何在同一个表中定义两个FK?,asp.net,entity-framework,asp.net-core,Asp.net,Entity Framework,Asp.net Core,我有一个名为User的表,它继承了IdentityUser的属性,在该表中,我添加了对用户友谊表的引用,该表需要存储所有用户友谊: public class User : IdentityUser { public string FirstName { get; set; } public DateTime BirthDate { get; set; } public virtual ICollection<UserFriendship> UserFrie

我有一个名为
User
的表,它继承了
IdentityUser
的属性,在该表中,我添加了对
用户友谊
表的引用,该表需要存储所有用户友谊:

public class User : IdentityUser
{
    public string FirstName { get; set; } 
    public DateTime BirthDate { get; set; }

    public virtual ICollection<UserFriendship> UserFriendship { get; set; }
}
我定义了
UserA
UserB
,它们是
AspNetUsers
表中包含的
User
的两个
FK

现在在
FluentAPI
中,我声明了以下内容:

builder.Entity<UserFriendship>(entity =>
{
    entity.HasKey(f => f.Id);

    entity.HasOne(u => u.UserA)
          .WithMany(n => n.UserFriendships)
          .HasForeignKey(u => u.UserAId)
          .IsRequired();

    entity.HasOne(u => u.UserB)
          .WithMany(n => n.UserFriendships)
          .HasForeignKey(u => u.UserBId)
          .IsRequired();
 });
modelBuilder.Entity<UserFriendship>(entity =>
{
     entity.HasKey(f => f.Id);

     entity.HasOne(u => u.UserA)
         .WithMany(n => n.UserAFriendships)
         .HasForeignKey(u => u.UserAId)
         .IsRequired();

     entity.HasOne(u => u.UserB)
          .WithMany(n => n.UserBFriendships)
          .HasForeignKey(u => u.UserBId)
          .IsRequired();
});
我会得到:

无法在“User.UserFriendships”和“userfriends.UserB”之间创建关系,因为“User.UserFriendships”和“userfriends.UserA”之间已经存在关系。导航属性只能参与单个关系

我不是
EnityFramework
的专家,但是基于这个错误,我认为我不能在同一个表中定义两个
FK


很抱歉出现任何错误,谢谢。

您可以在表中定义多个FK。 这里的问题是您两次指向一个导航属性-
UserFriendships
。解决方案是创建两个导航属性

导航属性用于浏览实体的指定外键(您有一对多关系)的相关数据

试试这个:

public class User
{
    public string FirstName { get; set; }
    public DateTime BirthDate { get; set; }

    public ICollection<UserFriendship> UserAFriendships { get; set; }
    public ICollection<UserFriendship> UserBFriendships { get; set; }
}

public class UserFriendship
{
    public int Id { get; set; }

    public string UserAId { get; set; }
    public User UserA { get; set; }

    public string UserBId { get; set; }
    public User UserB { get; set; }
    public DateTime DateTime { get; set; }
 }
公共类用户
{
公共字符串名{get;set;}
公共日期时间出生日期{get;set;}
公共ICollection UserAFriendships{get;set;}
公共ICollection UserBFriendships{get;set;}
}
公共类用户友谊
{
公共int Id{get;set;}
公共字符串UserAId{get;set;}
公共用户UserA{get;set;}
公共字符串UserBId{get;set;}
公共用户UserB{get;set;}
公共日期时间日期时间{get;set;}
}
并通过fluent api定义关系如下:

builder.Entity<UserFriendship>(entity =>
{
    entity.HasKey(f => f.Id);

    entity.HasOne(u => u.UserA)
          .WithMany(n => n.UserFriendships)
          .HasForeignKey(u => u.UserAId)
          .IsRequired();

    entity.HasOne(u => u.UserB)
          .WithMany(n => n.UserFriendships)
          .HasForeignKey(u => u.UserBId)
          .IsRequired();
 });
modelBuilder.Entity<UserFriendship>(entity =>
{
     entity.HasKey(f => f.Id);

     entity.HasOne(u => u.UserA)
         .WithMany(n => n.UserAFriendships)
         .HasForeignKey(u => u.UserAId)
         .IsRequired();

     entity.HasOne(u => u.UserB)
          .WithMany(n => n.UserBFriendships)
          .HasForeignKey(u => u.UserBId)
          .IsRequired();
});
modelBuilder.Entity(Entity=>
{
entity.HasKey(f=>f.Id);
entity.HasOne(u=>u.UserA)
.有许多(n=>n.UserAFriendships)
.HasForeignKey(u=>u.UserAId)
.IsRequired();
entity.HasOne(u=>u.UserB)
.有许多(n=>n.UserBFriendships)
.HasForeignKey(u=>u.UserBId)
.IsRequired();
});

更重要的是,如果您使用Fluent API,您不需要指定属性
Key,ForeignKey

谢谢这项工作,您认为我的实现是正确的还是有其他简单的方法来实现这一点?