c# - IDbSet<T> 上没有 FindAsync() 方法

标签 c# entity-framework asp.net-identity

FindAsync() 是否有原因? IDbSet<T> 中省略了方法界面? Find是界面的一部分,异步版本不可用似乎很奇怪。我需要转换到 DbSet<T>访问它,这有点麻烦:

User user = await ((DbSet<User>)db.Users)
    .FindAsync("de7d5d4a-9d0f-48ff-9478-d240cd5eb035");

最佳答案

如果您拥有 IDbSet<T> 的消费者,我假设你这样做是因为你想访问 FindAsync()从消费者内部,那么一个简单的解决方案是创建您自己的接口(interface),其中包括 IDbSet 并包含 FindAsync() 中的任何一个。您要使用的方法:

public interface IAsyncDbSet<T> : IDbSet<T>
    where T : class
{
    Task<T> FindAsync(params Object[] keyValues);
}

这解决了不必强制转换为 DbSet 的问题——顺便说一句,这消除了契约编码的抽象性优势。但这也带来了一系列问题。

一个更好的解决方案 (imo) 需要更多的工作是定义一个接口(interface),该接口(interface)只包含您想要使用的成员,否则将是您的 DbSet 对象,在实现时子类 DbSet接口(interface),然后在您的代码中使用该接口(interface):

public interface IMyAsyncDbSet<TEntity>
    where TEntity : class
{
    TEntity Add(TEntity entity);
    TEntity Remove(TEntity entity);

    // Copy other methods from IDbSet<T> as needed.

    Task<Object> FindAsync(params Object[] keyValues);
}

public class MyDbSet<T> : DbSet<T>, IMyAsyncDbSet<T>
    where T : class
{
}

这是一个适配器模式,真的。它将您的代码期望的接口(interface)与 Entity Framework 提供的接口(interface)分离。现在,它们是相同的——这就是为什么实现除了继承 DbSet<T> 什么都不做的原因。 .但后来他们可能会出现分歧。到那时,您仍然可以使用最新的 DbSet 而不会破坏您的代码。

关于c# - IDbSet<T> 上没有 FindAsync() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21800967/

相关文章:

c# - UI 空闲时 iOS 后台线程变慢

c# - 为什么 Graphics.MeasureString() 返回的数字高于预期?

c# - EF 和 WinForms - 维护实体的静态列表

c# - 使用 DbContext 接口(interface)注册 AspNetCore 2.1 Identity 系统

asp.net-mvc - WsFederation 和本地用户混合认证

c# - 如何形成这个正则表达式

C#:简化许多类似的隐式运算符方法

c# - 使用代码优先 Entity Framework 执行从一个到多个的关联

c# - Entity Framework Code First 方法类中的业务逻辑类型方法

c# - Store 没有实现 IUserRoleStore<TUser> ASP.NET Core Identity