首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EF核心一对多还是多对多?用户<->朋友

EF核心一对多还是多对多?用户<->朋友
EN

Stack Overflow用户
提问于 2018-11-11 10:36:24
回答 1查看 1.3K关注 0票数 3

我将在我的项目中实现一个用户朋友模块。

假设我有两个简单的类

代码语言:javascript
运行
复制
public class User
{
    int Id { get; set; }
    string Name { get; set; }
}

和FriendShip类(它在用户之间有关系):

代码语言:javascript
运行
复制
public class FriendShip
{
    int User1Id { get; set; }
    int User2Id { get; set; }
    int Status  { get; set; }
}

状态类型为Enum

这两个类的逻辑--

  • 当第一个用户邀请第二个用户进入他的友谊列表时,应该在数据库中创建两个对象。
代码语言:javascript
运行
复制
user1Id: 1,
user2Id: 2,
Status: 1, (where 1 means 'invited')
代码语言:javascript
运行
复制
user1Id: 2,
user2Id: 1,
Status: 0,    (where 0 means 'nonaccepted')
  • 当第二个用户接受时,这2种状态将由值3更新(意思是“友谊”或类似的东西)--但是现在不要谈逻辑了。

我不知道如何设计数据库。

这将是一对多,就像一个用户可以有许多关系与其他-用户?

私钥必须是两个外键: user1,user2

问题是这两个外键指向一个表(用户)

我试过像这样的东西

代码语言:javascript
运行
复制
modelBuilder.Entity<User>()
    .HasMany(x => x.UsersFriendships)
    .WithOne(x => x.User2)

modelBuilder.Entity<UsersFriendship>()
    .HasMany(x => x.Users)
    .WithOne(x => x.UsersFriendships)

但这没有道理,我不能做第二句话

代码语言:javascript
运行
复制
.WithOne(x => x.userFriendships)

最简单的方法是输入模型生成器。

代码语言:javascript
运行
复制
modelBuilder.Entity<UsersFriendship>()
   .HasKey(x => new { x.User1Id, x.User2Id });

UserFriendship类:

代码语言:javascript
运行
复制
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)。

当我向用户类添加导航属性时

代码语言:javascript
运行
复制
public virtual List<UsersFriendship> UsersFriendships { get; set; }

数据库将有四个字段: user1Id、user2Id、status、userId

最近的字段来自user class (UsersFriendships字段) <--我不希望这个字段出现在我的数据库中!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-11 10:47:55

您可以在官方文档中找到一个例子:https://learn.microsoft.com/en-us/ef/core/modeling/relationships#many-to-many

我调整了这个示例以反映您的情况:

代码语言:javascript
运行
复制
namespace foo
{
  public class User
  {
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<UsersFriendship> UsersFriendships { get; set; }
  }

  public class Friendship
  {
      public User User1 { get; set; }
      public int User1Id { get; set; }
      public User User2 { get; set; }
      public int User2Id { get; set; }
      public int Status  { get; set; }
  }

  class MyContext : DbContext
  {
      public DbSet<Friendship> Friendships { get; set; }
      public DbSet<User> Users { get; set; }

      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          modelBuilder.Entity<Friendship>()
              .HasKey(fs => new { fs.User1, fs.User2, fs.Status });

          modelBuilder.Entity<Friendship>()
              .HasOne(fs => fs.User1)
              .WithMany(u => u.UsersFriendships)
              .HasForeignKey(fs => fs.User1);

          modelBuilder.Entity<Friendship>()
              .HasOne(fs => fs.User2)
              .WithMany(u => u.UsersFriendships)
              .HasForeignKey(fs => fs.User2);
      }
  }

最近的字段来自user class (UsersFriendships字段) <--我不希望这个字段出现在我的数据库中!

当将其注册为导航属性(请参阅我的代码)时,它将不会存储在db中。

在其他情况下,如果出于某些原因不希望通过ef核心将属性存储在db中,请使用[NotMapped]属性(namespace System.ComponentModel.DataAnnotations.Schema)标记该属性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53247895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档