簡體   English   中英

EF Core 是一對多還是多對多? 用戶<-->朋友

[英]EF Core one-to-many or many-to-many ? users<-->friends

我將在我的項目中實現一個用戶朋友模塊。

假設我有 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; }
   }

狀態為枚舉

這兩個類的邏輯:

  • 當第一個用戶邀請第二個用戶加入他的好友列表時,數據庫中應該創建了 2 個對象

    user1Id: 1, user2Id: 2, Status: 1, (where 1 means 'invited')

    user1Id: 2, user2Id: 1, Status: 0, (where 0 means 'nonaccepted')
  • 當第二個用戶接受時,這兩個狀態將更新為值 3(其中表示“友誼”或類似的東西 - 但現在忘記邏輯。

我不知道如何從代碼(在 C# 中)創建這個數據庫結構

它將是一對多的,就像一個用戶可以與其他用戶有很多關系一樣?

你的私鑰必須是 2 fk: user1, user2

問題是,這 2 個外鍵轉到一張表(用戶)

我試過這樣的事情:

    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)

當我將導航屬性添加到 User 類時:

public virtual List<UsersFriendship> UsersFriendships { get; set; }

數據庫會有四個字段:user1Id、user2Id、status、userId

最新字段來自用戶類(UsersFriendships 字段)<-- 我不想在我的數據庫中使用這個字段!

您可以在官方文檔中找到一個示例: https : //docs.microsoft.com/en-us/ef/core/modeling/relationships#many-to-many

我調整了這個例子來反映你的情況:

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);
      }
  }

最新字段來自用戶類(UsersFriendships 字段)<-- 我不想在我的數據庫中使用這個字段!

將其注冊為導航屬性時(請參閱我的代碼),它將不會存儲在 db 中。

在其他情況下,如果由於某種原因您不希望 ef 核心將屬性存儲在 db 中,請使用[NotMapped]屬性( namespace System.ComponentModel.DataAnnotations.Schema )標記該屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM