EF Core 2.0使用OwnsOne映射复杂类型时能否自定义列前缀?
当然可以自定义前缀!
在EF Core 2.0中,虽然没有直接提供一键设置嵌入类型前缀的API,但通过两种方式可以实现将默认的Attributes_前缀替换为Attr_:
方法1:手动为每个属性指定列名(直观适合属性少的场景)
直接在OwnsOne的配置回调中,为每个子属性调用HasColumnName来指定带自定义前缀的列名:
e.OwnsOne(x => x.Attributes, cb => { // 为Attributes自身的属性指定前缀 cb.Property(a => a.SomeAttribute).HasColumnName("Attr_SomeAttribute"); cb.Property(a => a.AnotherAttribute).HasColumnName("Attr_AnotherAttribute"); // 为嵌套的Supplier子类型属性指定前缀 cb.OwnsOne(a => a.Supplier, sCb => { sCb.Property(s => s.SupplierId).HasColumnName("Attr_SupplierId"); sCb.Property(s => s.SupplierName).HasColumnName("Attr_SupplierName"); }); });
方法2:通过元数据批量修改(适合属性多的场景)
如果你的复杂类型包含很多属性,手动逐个指定太繁琐,可以通过遍历嵌入类型的元数据来批量替换前缀。记得要引入Microsoft.EntityFrameworkCore.Relational命名空间来访问关系数据库的元数据API:
using Microsoft.EntityFrameworkCore.Relational; // ... e.OwnsOne(x => x.Attributes, cb => { var ownedEntityMetadata = cb.Metadata; // 遍历Attributes类型的所有属性,替换前缀 foreach (var property in ownedEntityMetadata.GetProperties()) { var originalColumnName = property.Relational().ColumnName; property.Relational().ColumnName = originalColumnName.Replace("Attributes_", "Attr_"); } // 对嵌套的Supplier子类型做同样的批量替换 cb.OwnsOne(a => a.Supplier, sCb => { var supplierMetadata = sCb.Metadata; foreach (var prop in supplierMetadata.GetProperties()) { var originalName = prop.Relational().ColumnName; // 默认前缀是"Attributes_Supplier_",替换为"Attr_Supplier_" prop.Relational().ColumnName = originalName.Replace("Attributes_Supplier_", "Attr_Supplier_"); } }); });
需要注意的是,EF Core 2.0的关系元数据API依赖Relational()扩展方法,这和后续版本(3.0+)的直接属性访问有所不同,所以要确保引入正确的命名空间。
内容的提问来源于stack exchange,提问作者Tommy Jakobsen
相关产品推荐
相关产品推荐

