【发布时间】:2015-05-14 19:16:29
【问题描述】:
我有以下从实体框架类派生的类如下。
internal class MyInitializer : CreateDatabaseIfNotExists<ConfigurationDbContext>
{
protected override async void Seed(ConfigurationDbContext context)
{
await DbHelper.AddSampleDataAsync(context);
base.Seed(context);
}
}
当我将“void”更改为“async Task”时,出现以下编译器错误。
return type must be 'void' to match overridden member
async/await 最佳实践告诉您几乎总是返回 async Task 而不是 void。只是想确保我在这里使用的 void 是使用 void 的可接受场景之一。我还有什么其他选择?
【问题讨论】:
-
您覆盖了一个方法,因此您必须具有与被覆盖的方法相同的签名。
-
如果您异步执行工作并且任何调用
Seed(通过此类型或通过父类型)的人将在工作实际完成之前返回,该类型是否会正常运行,并且没有提供任何方法来确定此操作的结果(或任何错误)?如果是,则保留 async void 方法,如果不是,则必须要么不异步执行操作,要么不满足此签名。 -
EF 希望这会同步发生,因此您应该同步添加种子数据。
-
@CharlesMager,我认为你是对的。我也认为 EF 应该提供 SeedAsync()。
-
@Servy,由于 EF 不提供 SeedAsync(),JNYRanger 的解决方案看起来还不错,你不觉得吗?
标签: c# async-await