如何使用 c# EF fluent api 为值对象成员创建索引

how to create index for value-object member using c# EF fluent api

我有包含名称为 IdCard 的值对象的实体,如下所示:

public class UserProfile : BaseEntity<long>
{
  public byte Gender { get; private set; } = 0;

  public int? BirthDate { get; private set; }

  public IdCard IdCard { get; set; }
}

IdCard 成员是这样的:

public class IdCard : ValueObject
    {
        public int? Type { get; set; }

        public string No { get; set; }
    }

我需要使用 EF fluent 将 IdCard No 作为索引 api

类似这样的事情

builder.HasIndex(c => c.IdCard.No);

您的 IdCard 的广告构造函数将采用单个参数,在本例中为 No。当值对象具有将存储在数据库中的单个字段时,以下应该适用,因此 Type 不必存储,但在数据库提取之后计算。否则,这将必须存储为拥有的实体。 或者,您可以将 TypeNo 一起存储在单个字段中,并为这些字段提供自定义转换器,但至少可以说此解决方案不是最优的。

在流畅的配置中,假设尝试:

modelBuilder.Entity<UserProfile>(builder =>
{
    builder.HasIndex(c => c.IdCard);
    builder.Property(p => p.IdCard)
        .HasConversion(id => id.No, value => new IdCard(value)); 
});

我不记得这是否可以在 EF 核心中正常工作 - 过去用于主键的转换器存在一些问题,但值得一试。

查看 Implement value objects from Microsoft and Using Value Objects with Entity Framework Core 链接。这两个很有帮助。

您可以创建 UserProfileConfiguration class 如下:

public class UserProfileConfiguration : IEntityTypeConfiguration<UserProfile>
{
    public void Configure(EntityTypeBuilder<UserProfile> builder)
    {
        builder.HasKey(x => x.Id);
        builder.OwnsOne(x => x.IdCard);
        builder.HasIndex(x => x.No);
    }
}

然后,在 DbContextOnModelCreating 方法中应用它:

modelBuilder.ApplyConfiguration(new UserProfileConfiguration());