You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 06:58:10