c# - DbContext 类的 IDbSet 属性的适配器模式

标签 c# entity-framework adapter dbcontext dbset

有没有办法使用这个答案中描述的方法No FindAsync() method on IDbSet对于 DbContext 的 DbSet 属性?

编辑:

链接的答案包含如何构建从 IDbSet 继承的接口(interface)并添加对 DbSet 类的 SearchAsync 方法的支持的说明。我理解 Keith Payne 所写的所有内容,但我不知道如何在 DbContext 中使用它。

例如,我有一个看起来像这样的 DbContext:

public class MyContext : DbContext
{ 
    public DbSet<Customer> Customers { get; set; }
}

如何使用 MyDbSet(答案中描述的类。)或类似的类,而不是 DbSet?

public class MyContext : DbContext
{ 
    public MyDbSet<Customer> Customers { get; set; }
}

现在的问题是, Entity Framework 似乎只为 IDbSet 或 DbSet 类型的属性生成表。

最佳答案

您的上下文中有常规 DbSet,并创建一个适配器来添加请求的接口(interface)。

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

public sealed class DbSetAdapter<T> : IAsyncDbSet<T>, IDbSet<T>
    where T : class
{
    private readonly DbSet<T> _innerDbSet;

    public DbSetAdapter(DbSet<T> innerDbSet)
    {
        _innerDbSet = innerDbSet;
    }

   public Task<T> FindAsync(params object[] keyValues)
   {
          return _innerDbSet.FindAsync(keyValues);
   }

   //Here implement each method so they call _innerDbSet like I did for FindAsync
}

现在您可以创建一个 DbSetAdapater当你需要它并获得 IAsyncDbSet 时。 您可以复制您的属性,因为 EF 似乎会忽略它们或添加 ToAsyncDbSet() IDbSet<T> 的扩展方法

public class MyContext : DbContext
{ 
    public DbSet<Customer> Customers { get; set; }
    public IAsyncDbSet<Customer> CustomersAsync { get { return new DbSetAdapter<Customer>(Customers); } }
}

关于c# - DbContext 类的 IDbSet 属性的适配器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23730949/

相关文章:

C# 将字符串格式化为日期

c# - 如何用插件内的 View 文件覆盖 nopcommerce View 文件?

visual-studio-2010 - 如何将 Entity Framework 4 与 Visual Studio 2013 结合使用

asp.net - EF缓存: How to detach objects *completely* before inserting them into HttpRuntime cache?

java - 数组适配器中出现空指针异常。没有找到 View ?

android - 使用bindview后如何获取 View 对象?

Android SQLite 查询分组依据和排序依据

c# - 在wpf中绘制垂直线

.net - 没有行为的 Entity Framework POCO-需要重新设计以消除代码异味

c# - 从 ASP.NET Core 中的方法属性访问泛型类参数 T