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
。谢谢这项工作,您认为我的实现是正确的还是有其他简单的方法来实现这一点?