[英]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.