EF Core 8是否支持Owned属性嵌套ComplexType?
EF Core 8 支持 Owned 属性内嵌套 ComplexType 场景吗?
答案是完全支持,你遇到的构建错误是配置方式不正确导致的,并非功能本身不支持。
问题根源
OwnedNavigationBuilder 确实没有 ComplexProperty 方法——因为 Owned 类型本身就是 EF Core 中一种特殊的复杂类型实现,对于 Owned 内部的 ComplexType,不需要用 ComplexProperty 手动声明,直接通过常规属性配置或嵌套 OwnsOne 即可让 EF Core 正确识别。
正确配置示例
1. 实体类定义(确保标记正确)
[ComplexType] public class TrashData { public bool IsDeleted { get; set; } public DateTime? DeletedAt { get; set; } } public class UserMetaData { // 直接嵌套标记为 ComplexType 的 TrashData public TrashData TrashData { get; set; } // 其他自定义元数据属性... } public class User : IdentityUser { // Owned 属性 public UserMetaData UserMetaData { get; set; } }
2. Fluent API 配置方式
在 DbContext 的 OnModelCreating 方法中,无需额外声明 TrashData 为 ComplexType,只需通过嵌套 OwnsOne 或直接配置属性即可:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 必须保留,确保 Asp Identity 默认配置生效 modelBuilder.Entity<User>(userBuilder => { // 配置 UserMetaData 为 Owned 类型 userBuilder.OwnsOne(u => u.UserMetaData, metaBuilder => { // 若需自定义 TrashData 相关列的映射,直接嵌套配置 metaBuilder.OwnsOne(m => m.TrashData, trashBuilder => { trashBuilder.Property(t => t.IsDeleted).HasColumnName("IsDeleted"); trashBuilder.Property(t => t.DeletedAt).HasColumnName("DeletedAt"); }); // 配置 UserMetaData 的其他属性... }); }); }
迁移生成注意事项
- 确保已安装匹配 EF Core 8 版本的 NuGet 包:
Microsoft.EntityFrameworkCore.Sqlite、Microsoft.EntityFrameworkCore.Tools、Microsoft.AspNetCore.Identity.EntityFrameworkCore - 确认 DbContext 配置无误后,执行迁移命令:
dotnet ef migrations add InitialCreate dotnet ef database update
内容的提问来源于stack exchange,提问作者Adnan
相关产品推荐
相关产品推荐

