EF Core 8中通过反射处理OwnsOne/OwnsMany实体并为所有实体添加阴影属性的问题
EF Core 8中通过反射处理OwnsOne/OwnsMany实体并为所有实体添加阴影属性的问题
看起来你遇到的问题挺典型的——那些用OwnsOne/OwnsMany配置的从属实体,虽然可能继承了Entity类,但它们本质上是依附于主实体的"Owned实体",并不需要单独添加CreatedDate、UpdatedDate这类阴影属性,所以才会触发报错。
解决这个问题只需要在筛选实体类型时,把Owned实体排除出去就行。EF Core专门提供了IsOwned()方法来判断一个实体类型是否为Owned类型,咱们把这个条件加到你的筛选逻辑里:
var entityTypes = builder.Model.GetEntityTypes() .Where(e => typeof(Entity).IsAssignableFrom(e.ClrType) && e.ClrType != typeof(Entity) && !e.IsOwned()); // 新增这行,排除Owned实体 foreach (var entityType in entityTypes) { builder.Entity(entityType.ClrType) .Property<DateTime>("CreatedDate") .HasDefaultValueSql("GETUTCDATE()"); builder.Entity(entityType.ClrType) .Property<DateTime?>("UpdatedDate") .HasConversion(new ValueConverter<DateTime, DateTime>(v => v.ToUniversalTime(), v => DateTime.SpecifyKind(v, DateTimeKind.Utc))) .ValueGeneratedOnUpdate(); }
修改后,代码就只会给独立的、继承自Entity的实体类型添加阴影属性,那些属于OwnsOne/OwnsMany的从属实体都会被自动跳过,之前的错误也就不会出现了。
顺带提个小细节:如果你的EF Core版本足够新,UpdatedDate的UTC转换其实可以简化,不过这不是硬性要求,根据你的实际需求调整就好。
备注:内容来源于stack exchange,提问作者arman
相关产品推荐
相关产品推荐

