[英]Non-static foreign key EF core
我正在开发一个信使 API,它会像不和谐一样有人向另一个用户发送好友请求,如果用户接受,他们就会开始消息传递。 如您所知,每个FriendRequest
有两个联系人,发送者和接收者,有两种方法可以实现这种关系,一种方法是在FriendRequest
和联系人之间定义多对多关系,并将FriendRequest
的联系人限制为两个。 另一种方法是在FriendRequest
中定义两个属性, SenderContact
和ReceiverContact
。
我选择了第二种方式,每个FriendRequest
应该有两个外键和两个联系人。 但是 EF 自动添加了另一个外键。 我只想知道两件事
1:我选择的第二种方式是好方式吗? 有没有更好的方法来实现这种情况?
2:我可以阻止 EF 创建ContactId
列吗?
MyConext 中的 OnModelCreating:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Contact>().HasMany<FriendRequest>().WithOne(f => f.FromContact);
builder.Entity<Contact>().HasMany<FriendRequest>().WithOne(f => f.ToContact);
base.OnModelCreating(builder);
}
好友请求:
public class FriendRequest
{
public int Id { get; set; }
public Contact FromContact { get; set; }
public Contact ToContact { get; set; }
public string Text { get; set; }
}
接触:
public class Contact
{
[Key]
public int Id { get; set; }
public int UserId { get; set; }
public string Username { get; set; }
public ICollection<Chat> Chats { get; set; }
public ICollection<FriendRequest> FriendRequests { get; set; }
public ICollection<Contact> Friends { get; set; }
}
你的方法对我来说似乎没问题,但你有一个配置错误。 您的联系对象应该是
public class Contact
{
[Key]
public int Id { get; set; }
public int UserId { get; set; }
public string Username { get; set; }
public ICollection<Chat> Chats { get; set; }
public ICollection<FriendRequest> SentFriendRequests { get; set; }
public ICollection<FriendRequest> ReceivedFriendRequests { get; set; }
public ICollection<Contact> Friends { get; set; }
}
FriendRequest 可以保持不变,但建议定义一个外键
public class FriendRequest
{
public int Id { get; set; }
public Contact FromContact { get; set; }
public Contact ToContact { get; set; }
public string Text { get; set; }
}
和配置
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Contact>()
.HasMany<FriendRequest>(c => c.SentFriendRequests)
.WithOne(f => f.FromContact);
builder.Entity<Contact>()
.HasMany<FriendRequest>(c => c.ReceivedFriendRequests)
.WithOne(f => f.ToContact);
base.OnModelCreating(builder);
}
在配置关系时,我总是会再次查看MS 文档,我建议您这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.