【发布时间】:2019-04-14 07:57:52
【问题描述】:
我将在我的项目中实现一个用户朋友模块。
假设我有 2 个简单的类:
public class User
{
int Id { get; set; }
string Name { get; set; }
}
和FriendShip类(用户之间有关系):
public class FriendShip
{
int User1Id { get; set; }
int User2Id { get; set; }
int Status { get; set; }
}
状态类型为Enum
这两个类的逻辑:
- 当第一个用户邀请第二个用户加入他的好友列表时,应该在数据库中创建 2 个对象
user1Id: 1,
user2Id: 2,
Status: 1, (where 1 means 'invited')
user1Id: 2,
user2Id: 1,
Status: 0, (where 0 means 'nonaccepted')
- 当第二个用户接受时,这 2 个状态将通过值 3 更新(其中表示“友谊”或类似的东西 - 但现在忘记逻辑。
我不知道如何设计数据库。
这将是一对多的,就像一个用户可以与其他用户有许多关系?
私钥必须是2个外键:user1,user2
问题是这两个外键进入一个表(用户)
我试过这样的:
modelBuilder.Entity<User>()
.HasMany(x => x.UsersFriendships)
.WithOne(x => x.User2)
modelBuilder.Entity<UsersFriendship>()
.HasMany(x => x.Users)
.WithOne(x => x.UsersFriendships)
但这没有意义,我不能做第二个陈述
.WithOne(x => x.userFriendships)
最简单的方法是输入模型生成器:
modelBuilder.Entity<UsersFriendship>()
.HasKey(x => new { x.User1Id, x.User2Id });
UserFriendship 类:
public class UsersFriendship
{
[ForeignKey("User1Id")]
public User User1 { get; set; }
[ForeignKey("User2Id")]
public User User2 { get; set; }
public int User1Id { get; set; }
public int User2Id { get; set; }
public RelationStatus RelationStatus { get; set; }
}
但是从现在开始,我无法从用户实体导航到他的朋友(例如User.Friendship)
当我将导航属性添加到用户类 :
public virtual List<UsersFriendship> UsersFriendships { get; set; }
数据库会有四个字段:user1Id、user2Id、status、userId
最新的字段来自用户类(UsersFriendships 字段)
【问题讨论】:
-
顺便说一句,我假设你的朋友不是船(在
class Friendship中将“ship”小写) -
Дмитрий Данилов 在Answer 中说“这个解决方案对我不起作用。相反,我找到了一个类似问题的以下答案,解决了多对多自引用问题我:stackoverflow.com/a/49219124/430742"
标签: c# .net-core entity-framework-core