gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:34:35 25 4
gpt4 key购买 nike

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/

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