这个有效:
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);
}
答案是——视情况而定!
如果T
有class
约束,它将调用 (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/