如何使用 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
不必存储,但在数据库提取之后计算。否则,这将必须存储为拥有的实体。
或者,您可以将 Type
和 No
一起存储在单个字段中,并为这些字段提供自定义转换器,但至少可以说此解决方案不是最优的。
在流畅的配置中,假设尝试:
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);
}
}
然后,在 DbContext
的 OnModelCreating
方法中应用它:
modelBuilder.ApplyConfiguration(new UserProfileConfiguration());
我有包含名称为 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
不必存储,但在数据库提取之后计算。否则,这将必须存储为拥有的实体。
或者,您可以将 Type
和 No
一起存储在单个字段中,并为这些字段提供自定义转换器,但至少可以说此解决方案不是最优的。
在流畅的配置中,假设尝试:
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);
}
}
然后,在 DbContext
的 OnModelCreating
方法中应用它:
modelBuilder.ApplyConfiguration(new UserProfileConfiguration());