我有一个名为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
中的FK
和User
。
现在在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
?
对不起,谢谢。
答案 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
。