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

时间:2018-10-23 10:14:54

标签: asp.net entity-framework asp.net-core

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

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

    public virtual ICollection<UserFriendship> UserFriendship { get; set; }
}

基本上,UserFriendship包含两个用户,他们是具有共同友谊的用户,这是模型定义:

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

    [Key, ForeignKey("UserA")]
    public string UserAId { get; set; }
    public User UserA { get; set; }

    [Key, ForeignKey("UserB")]
    public string UserBId { get; set; }
    public User UserB { get; set; }

    [Required]
    public DateTime DateTime { get; set; }
}

我定义了UserA表中包含的{{1}的两个UserB中的FKUser

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

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

我会得到:

  

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

我不是add-migration InitialMigration -context MyAppContext 的专家,但是基于该错误,我认为我无法在同一张表中定义两个EnityFramework

对不起,谢谢。

1 个答案:

答案 0 :(得分:1)

您可以在表中定义多个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; }
 }

并通过流利的api定义关系,如下所示:

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

还有什么-如果您使用Fluent API,则无需指定属性Key, ForeignKey