实体类型'List<Guid>'需定义主键,已设Id仍触发Dotnet测试报错
问题原因
错误提示里的List<Guid>指的是你实体中的Books属性,EF Core默认会把集合类型的属性识别为需要映射到数据库的实体,但List<Guid>是值类型集合,不是带主键的实体类,所以才抛出这个错误。你定义的Id是当前实体的主键,和Books属性无关。
解决方法
根据你的需求选择对应的方案:
方案1:不需要将Books属性存入数据库
如果这个集合只是内存中使用,不需要持久化到数据库,直接用[NotMapped]特性标记该属性,告诉EF Core不要映射它:
[Key] public int Id { get; set; } [NotMapped] public List<Guid> Books { get; set; }
方案2:需要将Books属性存入数据库
如果要把Guid集合存到数据库,EF Core 5及以上版本支持值转换,可将集合转换成字符串或JSON格式存储:
方式A:使用字符串分隔转换
在DbContext的OnModelCreating方法中配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<你的实体类名>() .Property(e => e.Books) .HasConversion( // 把List<Guid>转成逗号分隔的字符串 v => string.Join(',', v), // 把字符串转回List<Guid> v => v.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(Guid.Parse).ToList() ); }
方式B:使用JSON格式存储(推荐)
JSON格式能避免Guid中出现分隔符的问题,配置方式如下:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<你的实体类名>() .Property(e => e.Books) .HasConversion( v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize<List<Guid>>(v, (JsonSerializerOptions)null) ) // 指定数据库列类型为json(根据数据库调整,比如SQL Server用nvarchar(max)也可以) .HasColumnType("json"); }
内容的提问来源于stack exchange,提问作者Paras Dalsaniya
相关产品推荐
相关产品推荐

