entity-framework - Entity Framework Core 的 AddRangeAsync() 在通用方法中不起作用

标签 entity-framework entity-framework-core

这个有效:

await AddRangeAsync(myEntities);

但这行不通:

await AddEntities(myEntities);

...当我尝试使用此功能时:

private async Task AddEntities<T>(IEnumerable<T> entities)
{
    await AddRangeAsync(entities);
}

我得到一个错误:"The entity type 'List<MyType>' was not found. Ensure that the entity type has been added to the model."

这是我正在进行的更大抽象工作的一部分。为什么会出现此错误以及如何解决?

最佳答案

这是 params object[] 的另一个例子陷阱。

AddRangeAsync有两个重载:

(1)

Task AddRangeAsync(IEnumerable<object> entities, CancellationToken cancellationToken = default)

(2)

Task AddRangeAsync(params object[] entities)

我假设您想调用 (1),但问题是 - 这里实际上调用了哪个:

private async Task AddEntities<T>(IEnumerable<T> entities)
{
    await AddRangeAsync(entities);
}

答案是——视情况而定!

如果Tclass约束,它将调用 (1),否则 (2)。这是因为 IEnumerable<T>仅对引用类型是协变的,因此可以将其视为 IEnumerable<object>仅当编译器知道 T是引用类型,用class实现约束条件。

看起来你的类没有这样的约束,所以编译器对待IEnumerable<T>参数为 object (所有内容都可以转换为 object )并调用 (2),传递单个项目 object带有参数的数组,即这种情况下的实际调用是

await AddRangeAsync(new object[] { entities });

这应该揭开错误消息的神秘面纱。

话虽如此,要么使用 where T : class约束,或 Cast扩展方法:

await AddRangeAsync(entities.Cast<object>());

关于entity-framework - Entity Framework Core 的 AddRangeAsync() 在通用方法中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55818294/

相关文章:

c# - 使用c#模拟mysql压缩功能

c# - EntityFramework.dll 中出现 'System.ArgumentException' 类型的异常,但未在用户代码中处理

c# - 问题单元测试 EF 和 ASP.NET Identity - NotSupportedException : Model Compatibility

c# - EF Core - System.InvalidOperationException : ExecuteReader requires an open and available Connection. 连接的当前状态已关闭

c# - 一对多返回空数组

.net - 如何有效地支持生产环境中的 Entity Framework SQL 日志记录?

sql-server - 是否可以创建 Entity Framework 上下文实例的副本来进行并行查询

c# - 中断更改后如何在 EF Core 3.1 中创建复杂的动态查询?

c# - 在 EF Core 中配置抽象基类而不创建表

many-to-many - 如何删除 Entity Framework Core 中的多对多关系?