停止自动发现 EF Core 中的属性和类型



我正在尝试将一个大型旧项目从 EF 迁移到 EF Core。

我们总是有丰富的实体 - 里面有很多附加功能,而不是简单的死"数据持有者"。

当我们迁移到 EF Core 时,我注意到有一些"自动发现逻辑",它似乎遍历所有实体和属性,并尝试将它找到的所有相关实体和属性包含在 DbContext 中。这意味着我必须明确忽略所有未受数据库支持的内容。

否则我会收到这样的错误:

实体类型"参与者源"需要定义主键。如果 您打算使用调用"HasNoKey(("的无键实体类型。

我的实体上似乎没有ActorSource类型的直接属性,但我假设它在某处通过其他属性和自动发现泄漏。

有可能扭转这种情况吗?并且仅在模型中包含所有特别标记的内容?

免責聲明

这是一个在迁移过程中的大型相当复杂的项目 - 有可能发生其他事情,但据我所知,到目前为止,它似乎是某种自动发现

更新

现在我正在使用类似的东西:

var entity_types = modelBuilder.Model.GetEntityTypes().ToList();
foreach ( var type in entity_types )
{
if ( !type.ClrType.HasAttribute<TableAttribute>() )
{
modelBuilder.Ignore(type.ClrType);
continue;
}
var entity_type_builder = modelBuilder.Entity(type.ClrType);
foreach (var property in type.ClrType.GetProperties())
{
if ( !property.HasAttribute<ColumnAttribute>())
entity_type_builder.Ignore(property.Name);
}
}

请注意,您必须使用[Table]属性标记类,并使用[Column]属性标记属性。

目前还没有"公共"方法可以以 -clean- 的方式做到这一点(您可以在内部 API 上工作,但这是有风险的(。这是一个请求的功能(使约定公开(,但据我所知,还没有骰子。

但是,您可以在模型配置开始时遍历所有发现的属性和关系并忽略它们,然后配置其余属性和关系:类似于它们在此答案 https://stackoverflow.com/a/45883622/68972 中所做的(但调用Ignore而不是ValueGeneratedOnAdd并删除或调整Where子句(

最新更新