如何使用fluentApi来管理嵌套关系

本文关键字:嵌套 关系 管理 何使用 fluentApi | 更新日期: 2023-09-27 17:59:00

我有一个用户模型

public class User {
    public Guid IdGuid {get;set;}
    public string Name {get;set;}
    public virtual List<User> Friends {get;set;}
}

我有第二种型号的

public class UserFriendship{
    public Guid FriendShipIdGuid {get;set;}
    public Guid UserIdGuid {get;set;}
    public Guid FriendIdGuid {get;set;}
}

我在上下文中有FluentApi代码OnModelcreating

modelBuilder.Entity<User>().HasMany(u => u.Friends).WithMany().Map(c => {
    c.MapLeftKey("UserIdGuid"); 
    c.MapRightKey("FriendIdGuid");
    c.ToTable("UserFriendship");
    });

问题:我已经有了一个UserFriendship类模型。我想创建用户和这个模型之间的关系。我正在用FluentApi做这件事。

但在执行FluentApi代码后,FriendShipIdGuidUserFriendship表中删除。

我需要为Users创建一对多关系,并将其保存到表UserFriendship中,并将已存在的类模型名称映射到dbset的UserFriendship哪个元素。你能帮我吗?

总之,我已经上了UserFriendship课。该类包含FrientshipGuidId(密钥)、UserIdGuidFriendIdGuid。我需要将User类一对多映射到它自己。我想把这个关系保存在UserFriendship类上。我还想使用Userfriendship作为dbset。

我有

public DbSet<UserFriendship> Friendships { get;set; }

在我的背景下。

我正在使用FluentApi ToTable函数创建一对多关系表。但是FluentApi代码删除了FriendshipIdGuid字段。

如何使用fluentApi来管理嵌套关系

这是不可能的。您也不能在User类中使用List<UserFriendship>,因为有时User是用户,有时User是朋友,除非您的UserFriendship表中有重复项,如下所示:

Friendship table:          |
----------------------------
User / Friend
-------------
  A  /   B
  B  /   A
-------------

首先更改UserUserFriendship类如下:

class UserFriendship 
{
    public Guid FriendShipIdGuid {get;set;}
    public Guid UserIdGuid {get;set;}
    public Guid FriendIdGuid {get;set;}
    public User User {get;set;}
    public User Friend {get;set;}
}
class User 
{
    public Guid IdGuid {get;set;}
    public string Name {get;set;}
    // Only if you will allow duplicates in UserFriendship
    public virtual List<UserFriendship> Friendships {get;set;}
}

我不记得Fluent API的确切语法/方法,但你会想到:

modelBuilder.Entity<User>()
  .HasKey(u => u.IdGuid)
  .ToTable("User");
modelBuilder.Entity<UserFriendship>()
  .HasKey(uf => uf.FriendShipIdGuid)
  .ToTable("UserFriendship");
modelBuilder.Entity<UserFriendship>()
  .HasRequired(uf => uf.User)
  .WithMany(u => u.Friendships)       // Only if you allow duplicates
  //.WithMany()                         // Otherwise
  .HasForeignKey(uf => uf.UserIdGuid);
modelBuilder.Entity<UserFriendShip>()
   .HasRequired(uf => uf.Friend)
   .WithMany()
   .HasForeignKey(uf => uf.FriendIdGuid);