如何使用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表,而不需要查看用户的导航属性。
试着像这样配置它。
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的映射: