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/