当前位置: 首页 > 知识库问答 >
问题:

如何在EF Core5中映射Twitter follower/follower类型关系

梁兴文
2023-03-14

如何使用EF Core5和Fluent API配置类似于Twitter追随者和追随者类型的关系?我尝试了各种不同的方法来配置它,唯一能让它正常工作的方法是忽略用户实体上的导航属性。我目前正在将我的代码从EF Core2.1迁移到5。下面的配置在前面起作用。(不确定是否配置错误)

    public class User
    {
        public long Id { get; set; }

        public string Name { get; set; }

        public ICollection<UserFollower> Followers { get; set; }

        public ICollection<UserFollower> Following { get; set; }
    }

    public class UserFollower
    {
        public long UserId { get; set; }

        public User User { get; set; }

        public long FollowedById { get; set; }

        public User FollowedBy { get; set; }
    }

    public class UserFollowerConfiguration : IEntityTypeConfiguration<UserFollower>
    {
        public void Configure(EntityTypeBuilder<UserFollower> builder)
        {
            builder.HasKey(p => new { p.UserId, p.FollowedById });
            builder.HasOne(p => p.User)
                .WithMany(i => i.Followers)
                .HasForeignKey(i => i.UserId);
            builder.HasOne(p => p.FollowedBy)
                .WithMany(i => i.Following)
                .HasForeignKey(i => i.FollowedById);
        }
    }

此配置在保存到数据库时引发错误。

SqlException: Violation of PRIMARY KEY constraint 'PK_UserFollower'. 
Cannot insert duplicate key in object 'dbo.UserFollower'. The duplicate key value is (111, 111).

即使在尝试直接添加到DbContext并对其调用saveChanges()时也是如此。

context.add(new UserFollower(){UserId=222,FollowedById=111});

这样的关系映射到EF Core 5的推荐方式是什么?请注意,我确实需要访问UserFollowers表,而不需要查看用户的导航属性。

共有1个答案

施利
2023-03-14

试着像这样配置它。

builder.Entity<User>().HasMany(s => s.Followers)
    .WithOne(f => f.FollowedBy);
builder.Entity<User>().HasMany(s => s.Following)
    .WithOne(f => f.);

此外,userfollower表缺少PK,我不知道是否在某个地方生成了Id。如果不是,可能这就是它试图错误地使用FollowedbyID作为键的原因,但是为userfollower表定义了一个Id,请参阅。

public class UserFollower
{
    public long Id {get;set;} 

    public long UserId { get; set; }

    public User User { get; set; }

    public long FollowedById { get; set; }

    public User FollowedBy { get; set; }
 }

即使这样做有效,我也会建议您改变模型的结构,对于您描述的twitter需求来说,它看起来是模棱两可的。如果查询userfollowers

var userFollowers = _context.UserFollowers.ToList();

对于列表中的每个结果,我没有办法告诉用户是在跟踪还是被跟踪。你可以把你的模型换成这些;

public class User
{
    public long Id { get; set; }

    public string Name { get; set; }

    public ICollection<UserFollower> Followers { get; set; }

    public ICollection<UserFollowing> Following { get; set; }
}

public class UserFollower
{
    public long UserId { get; set; }

    public User User { get; set; }

    public long UserFollowingMeId { get; set; }

    public User UserFollowingMe { get; set; }
}
public class UserFollowing
{
    public long UserId { get; set; }

    public User User { get; set; }

    public long UserIAmFollowingId { get; set; }

    public User UserIAmFollowing { get; set; }
}

这样,每个人都知道,当他们检查userfollowers表时,userid是跟踪的人的Id,而userfollowers表则相反。如果我在系统中的Id是8,我可以这样查询我的追随者和我追随的人;

var myFollowers = _context.UserFollowers.Where(UserId = 8);
var peopleIFollow = _context.UserFollowing.Where(UserId = 8);
 类似资料:
  • 类型映射 web3j中使用的原生Java到ABI类型映射如下: boolean -> bool BigInteger -> uint/int byte[] -> bytes String -> string and address types List<> -> dynamic/static array BigInteger类型必须用于数字类型,因为Ethereum以太坊中的数字类型是256位整数

  • 问题内容: 在hibernate状态下,是否可以定义一个类到一组枚举的映射? 我已经找到了有关如何定义集合映射的示例,也已经找到了有关如何映射枚举的单独示例,但是我无法弄清楚如何为一个类定义枚举。 有人可以给我提供一个例子吗? 它是基于现有应用程序构建的,因此无法更改数据库架构。 这就是我要建模的关系。Wicket是普通类,而WicketType是Java枚举。 再次感谢 问题答案: 难道这不是你

  • 我在使用SWIG(3.0.6版)围绕C库生成Python包装时遇到了一些问题。 我的问题与应用输出类型映射有关,特别是在类类型的指针/引用的情况下。 为了说明,这就是我想要的标准类型,它是有效的: 您不必传入“resultLong”,但它会自动附加到结果中。太棒了 但是,当输出类型是指向类类型的指针时,这似乎不像我期望的那样工作: 问题似乎是SWIG没有以与简单类型相同的方式处理它。它仍然在包装函

  • TypeScript 会将一些好用的工具类型纳入基准库中,方便开发者直接使用,本节介绍的映射类型就是这样的工具类型。 对这种工具类型,我们不只要知道使用方法,还要了解其实现功能的本质。本节我们会从源码进行分析,逐步掌握。 1. 慕课解释 映射类型可以将已知类型的每个属性都变为可选的或者只读的。 2. Readonly 与 Partial 关键字 先来看这样一个任务:将 Person 接口的每个属性

  • 问题内容: 我继承了一个SQL Server数据库,该数据库正试图通过JPA进行映射。许多表都有一列。我试图像这样映射它们: Hibernate抱怨: 问题答案: POJO中主键属性的数据类型确定其映射DB列的数据类型,这由Dialect类指定。按照SQLServerDialect由Hibernate提供,它不具有任何数据类型映射到,并且在默认情况下映射到 我认为 基于主键的策略仅意味着hiber

  • 关于MapStruct的问题。我有这样的情况,我从基实体扩展类,但不知道如何映射它。这是我的箱子。 BaseEntity: 基础: 没有显示错误,在映射器实现(生成的代码)中没有该ID的映射: