Entity Framework测试中手动设置的实体GUID在创建时被覆盖问题
问题根本原因
导致你手动设置的Guid主键被覆盖主要有两个核心错误:
- EF Core默认对Guid类型主键开启了自动值生成策略,手动赋值会被默认生成的新值覆盖
AppRoles导航属性的外键配置错误,可能会干扰主键值的正常写入
修复步骤
- 显式关闭主键的自动值生成
在你的上下文配置代码中,针对Users实体的配置块添加属性配置,声明主键值由你手动提供:
builder.Entity<Users>(a => { a.HasKey(a => a.Id); // 新增这一行,关闭Id的自动生成逻辑 a.Property(p => p.Id).ValueGeneratedNever(); a.HasOne(b => b.Organization) .WithMany(b => b.Users); a.HasMany<UserOrganizations>(c => c.UserOrganizations); a.HasOne(b => b.AppRoles); });
- 修正AppRoles的外键配置
你当前在Users实体中给AppRoles加的[ForeignKey("Id")]注解是错误的,该配置表示用Users自己的主键Id作为关联UserRequestRoles表的外键,会干扰主键的赋值逻辑。
你需要在Users实体中新增独立的外键字段,再绑定外键关系:
public class Users { [Key] [Column("Id")] public Guid Id { get; set; } // 其他原有字段省略... // 新增外键字段 public Guid AppRolesId { get; set; } // 修正外键注解,绑定到新增的外键字段 [ForeignKey(nameof(AppRolesId))] public virtual UserRequestRoles AppRoles { get; set; } // 其他导航属性省略... }
如果你确实需要用共享主键的一对一关联,也需要在上下文配置中显式声明关联逻辑,避免默认规则干扰主键赋值。
验证
修改完成后重新执行种子代码,SaveChanges后查询Users实体的Id,即可看到你手动设置的3859e4c1-aaf7-4d9b-bc5e-8730ae9ad531已经被正常写入。
内容的提问来源于stack exchange,提问作者Jolo
相关产品推荐
相关产品推荐

