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

使用ValueObject时如何为嵌套的Name和Version属性添加联合索引?

EF Core 嵌套值对象属性的联合唯一索引配置方案

你的代码无法生成预期索引的原因是:创建索引时直接引用了Name和Version值对象实例,而EF Core需要明确指向它们映射到数据库的具体属性(即Value字段)。

以下是修正后的完整配置代码:

public void Configure(EntityTypeBuilder<Form> builder)
{
    builder.Property(p => p.Id).HasDefaultValueSql("NEWSEQUENTIALID()");

    builder.OwnsOne(form => form.FormFullName, formFullNameBuilder =>
    {
        formFullNameBuilder.OwnsOne(p => p.Name, nameBuilder =>
        {
            nameBuilder.Property(d => d.Value)
                .HasColumnName("Name")
                .IsRequired()
                .HasMaxLength(Name.MaxLength)
                .UsePropertyAccessMode(PropertyAccessMode.Field);
        });

        formFullNameBuilder.OwnsOne(p => p.Version, versionBuilder =>
        {
            versionBuilder.Property(d => d.Value)
                .HasColumnName("Version")
                .IsRequired()
                .HasMaxLength(Version.MaxLength)
                .UsePropertyAccessMode(PropertyAccessMode.Field);
        });

        // 正确配置:指向值对象的Value属性
        formFullNameBuilder.HasIndex(
                f => new {
                    f.Name.Value,
                    f.Version.Value
                })
            .HasDatabaseName("IX_Name_Version")
            .IsUnique();
    });
}

关键说明

  • 索引需要绑定到具体的数据库列对应的属性,这里通过f.Name.Value和f.Version.Value明确指定了属性路径,EF Core会据此识别到映射后的Name和Version数据库列。
  • 如果表达式写法遇到编译问题,也可以使用字符串形式指定属性路径作为替代:
    formFullNameBuilder.HasIndex("Name.Value", "Version.Value")
        .HasDatabaseName("IX_Name_Version")
        .IsUnique();
    

内容的提问来源于stack exchange,提问作者Sina Razavi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:33:25