gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:13:39 25 4
gpt4 key购买 nike

这个有效:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com