如何使用反射处理 EF Core 8 中的 OwnsOne 和 OwnsMany 实体

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

我想为所有实体添加阴影属性。

我所做的就是给父类(实体)添加影子属性。 为此,我在我的

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.