2

我在 EF Core 中设置了几个值对象(DDD 范式)作为拥有的类型。

EF Core 支持以一种方式配置拥有类型,它会通过该Owned()方法自动将对给定类型的所有引用视为拥有类型。

但是,我似乎找不到一种方法来以类似的集中方式指定它们的配置,尤其是值转换。

    {   // Configure value objects as owned types.
        builder.Owned(typeof(Money));
        builder.Owned(typeof(Currency));
        builder.Owned(typeof(Address));
        builder.Owned(typeof(Mass));
        builder.Owned(typeof(MassUnit));

        // Store and restore mass unit as symbol.
        builder.Entity<Product>()
            .OwnsOne(p => p.Mass, c => c.Property(m => m.Unit)
                .HasConversion(
                    u => u.Symbol,
                    s => MassUnit.FromSymbol(s))
                .HasMaxLength(3)
            );
    }

如上所见,为 配置了一个值转换MassUnit,它是一个嵌套在 中的值对象Mass

但是对于所有使用值对象的地方,我必须手动执行此操作。例如,我已经Money在 3 个不同的地方使用该类型,并且该类型包含Currency,我希望为其配置类似的值转换。

是否有任何(好的)方法来为拥有的类型指定一般的、域范围的配置?

我已经尝试builder.Entity<Mass>().Property(m => m.Unit).HasConversion(..)通过Entity<>.

4

1 回答 1

0

这可以使用共享ValueConverter

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    var converter = new ValueConverter<EquineBeast, string>(
        v => v.ToString(),
        v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));

    modelBuilder
        .Entity<Rider>()
        .Property(e => e.Mount)
        .HasConversion(converter);
}
于 2022-02-14T08:43:54.000 回答