EF6 Code First中如何配置OwnsMany实现表拆分
EF Core 一对多从属实体自定义表存储配置方案
在最新版EF Core(Code First + Fluent API)中,OwnsMany 配置一对多从属关系时,完全可以实现从属实体存储到自定义表,配置逻辑和OwnsOne对齐,仅需注意必须先配置从属关系对应的外键关联。
具体配置方法
写法1(推荐,EF Core 5.0及以上版本支持)
直接在OwnsMany的配置委托内调用ToTable方法即可,注意要先通过WithOwner()配置从属实体和主实体的外键关联:
modelBuilder.Entity<OwnerEntity>() .OwnsMany( o => o.OwnedEntityCollection, ownedBuilder => { // 配置从属实体指向主实体的外键,可使用实体已定义的属性,也可使用影子属性 ownedBuilder.WithOwner().HasForeignKey("OwnerEntityId"); // 指定从属实体存储的自定义表名 ownedBuilder.ToTable("Custom_OwnedEntity_Table"); // 其他从属实体属性配置,例如列名、主键等可在此处追加 // ownedBuilder.Property(x => x.PropertyName).HasColumnName("col_name"); } );
写法2(兼容EF Core 3.x等低版本)
如果使用的EF Core版本在OwnsMany构建器中没有暴露ToTable方法,可以先配置从属关系,再单独针对从属实体类型指定存储表:
// 第一步:配置一对多从属关系 modelBuilder.Entity<OwnerEntity>() .OwnsMany( o => o.OwnedEntityCollection, ownedBuilder => { ownedBuilder.WithOwner().HasForeignKey("OwnerEntityId"); } ); // 第二步:单独为从属实体指定自定义存储表 modelBuilder.Entity<OwnedEntity>() .ToTable("Custom_OwnedEntity_Table");
注意事项
- 配置
OwnsMany时必须显式调用WithOwner()配置外键,否则EF Core无法在从属表中建立和主实体的关联 - 存储到独立表的从属实体依然符合从属类型的核心规则:没有独立生命周期,完全跟随主实体执行增删改操作,不会作为独立实体被DbContext直接查询,和常规一对多导航关系有本质区别
- 如果没有为从属实体手动定义主键,EF Core会按约定生成影子主键,也可以在配置块内手动指定主键字段
内容的提问来源于stack exchange,提问作者jeancallisti
相关产品推荐
相关产品推荐

