You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实体类型'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:05:20