如何通过反射检测 ef core 8 中的 OwnsOne 和 OwnsMany 实体?

问题描述 投票:0回答:1

我想将 ShadowProperts 添加到所有实体。 我所做的是将shadowProperties添加到父类(Entity)中。 为此,我在 DbContext 中编写了以下代码:

var entityTypes = builder.Model.GetEntityTypes()
    .Where(e => typeof(Entity).IsAssignableFrom(e.ClrType) && e.ClrType != typeof(Entity));

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();
}

但问题是它会影响 OwnsOne 或 OwnsMany 的实体

无法创建“ContentCommandDbContext”类型的“DbContext”。这 异常'实体类型'注释'不能配置为非拥有 因为它已经被配置为拥有的。使用嵌套的 所有者实体类型构建器上的

OwnsOne
OwnsMany
中的构建器 进一步配置此类型。如果你想覆盖之前的 配置首先通过调用从模型中删除实体类型 '忽略'。请参阅 https://aka.ms/efcore-docs-owned 了解更多信息 和例子。尝试创建实例时抛出。为了 设计时支持的不同模式,请参见 https://go.microsoft.com/fwlink/?linkid=851728

为了避免此错误,我需要识别 OwnsOne 或 OwnsMany 实体,而不是将它们放入此代码中。我可以使用硬编码来执行此操作,例如:

var entityTypes = builder.Model.GetEntityTypes()
    .Where(e => typeof(Entity).IsAssignableFrom(e.ClrType) && e.ClrType != typeof(Entity) && e.ClrType != typeof(Comment));

它工作得很好,但在开发过程中会出现问题(我们都知道)。这可以使用反射来完成吗?我是反思新手。

c# reflection entity-framework-core
1个回答
0
投票

不需要反射,信息由 EF Core 元数据 API 提供,在本例中由 IReadOnlyEntityType.IsOwned 方法提供,例如

var entityTypes = builder.Model.GetEntityTypes()
    .Where(e => !e.IsOwned() && ...);
© www.soinside.com 2019 - 2024. All rights reserved.