EF Core 2.0复杂类型列类型修改:Fluent API报错求助
解决EF Core 2.0中复杂类型嵌套属性的Fluent API列类型配置问题
你遇到的这个错误,核心原因是EF Core 2.0不允许直接在实体的EntityTypeBuilder上引用复杂类型的嵌套属性来配置列类型——因为NestedProp本身是一个复杂类型(值对象),不是实体的标量属性,所以直接写x => x.NestedProp.Prop1会被判定为无效的属性表达式。
要解决这个问题,你需要使用EF Core的**拥有类型(Owned Type)**配置方式,通过OwnsOne方法先获取到嵌套类型的配置Builder,再在上面修改属性的列类型。
完整的OnModelCreating配置代码
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置Class1实体 modelBuilder.Entity<Class1>() // 声明NestedProp是Class1的拥有类型 .OwnsOne(c => c.NestedProp, nestedPropBuilder => { // 在拥有类型的Builder上配置Prop1的列类型 nestedPropBuilder.Property(p => p.Prop1) .HasColumnType("decimal(19,2)"); // 替换成你需要的目标列类型,比如decimal(18,4)等 }); }
为什么这样可行?
EF Core 2.0引入了拥有类型的概念,专门用来处理这种作为实体一部分的复杂类型(值对象)。通过OwnsOne,我们告诉EF Core:NestedProp是Class1的一个不可分割的部分,它的属性会被映射到和Class1相同的数据库表中(默认情况下),这样我们就能通过嵌套的Builder来配置它的属性细节,包括列类型。
这样配置后,EF Core就能正确识别Prop1并应用你指定的列类型,不会再抛出之前的错误了。
内容的提问来源于stack exchange,提问作者Bruno Henri
相关产品推荐
相关产品推荐

