使用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
相关产品推荐
相关产品推荐

