我想将 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
中的构建器 进一步配置此类型。如果你想覆盖之前的 配置首先通过调用从模型中删除实体类型 '忽略'。请参阅 https://aka.ms/efcore-docs-owned 了解更多信息 和例子。尝试创建实例时抛出。为了 设计时支持的不同模式,请参见 https://go.microsoft.com/fwlink/?linkid=851728OwnsMany
为了避免此错误,我需要识别 OwnsOne 或 OwnsMany 实体,而不是将它们放入此代码中。我可以使用硬编码来执行此操作,例如:
var entityTypes = builder.Model.GetEntityTypes()
.Where(e => typeof(Entity).IsAssignableFrom(e.ClrType) && e.ClrType != typeof(Entity) && e.ClrType != typeof(Comment));
它工作得很好,但在开发过程中会出现问题(我们都知道)。这可以使用反射来完成吗?我是反思新手。
不需要反射,信息由 EF Core 元数据 API 提供,在本例中由 IReadOnlyEntityType.IsOwned 方法提供,例如
var entityTypes = builder.Model.GetEntityTypes()
.Where(e => !e.IsOwned() && ...);