C# DbContext类的IDbSet属性的适配器模式
对于DbContext的DbSet属性,有没有一种方法可以使用这个答案中描述的方法 编辑: 链接的答案包含如何构建从IDbSet继承的接口并添加对DbSet类的SearchAsync方法的支持的描述。我理解Keith Payne写的所有东西,但我不知道如何在DbContext中使用它 例如,我有一个DbContext,它看起来像这样:C# DbContext类的IDbSet属性的适配器模式,c#,entity-framework,adapter,dbcontext,dbset,C#,Entity Framework,Adapter,Dbcontext,Dbset,对于DbContext的DbSet属性,有没有一种方法可以使用这个答案中描述的方法 编辑: 链接的答案包含如何构建从IDbSet继承的接口并添加对DbSet类的SearchAsync方法的支持的描述。我理解Keith Payne写的所有东西,但我不知道如何在DbContext中使用它 例如,我有一个DbContext,它看起来像这样: public class MyContext : DbContext { public DbSet<Customer> Customers
public class MyContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
公共类MyContext:DbContext
{
公共数据库集客户{get;set;}
}
如何使用MyDbSet(答案中描述的类)或类似的类来代替DbSet
public class MyContext : DbContext
{
public MyDbSet<Customer> Customers { get; set; }
}
公共类MyContext:DbContext
{
公共MyDbSet客户{get;set;}
}
现在的问题是,实体框架似乎只为IDbSet或DbSet类型的属性生成表。您的上下文中有常规的DbSet,并创建一个适配器添加请求的接口
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
}
好多了,好多了。然而,我认为你的第二个例子正是你应该做的。如果这样做不起作用,您是否有问题?如果是的话,你能解释一下你遇到了什么样的问题吗?我也这么认为……但是第二个例子不起作用。实体框架不会为不是DbSet或IDbSet类型的属性生成任何表。那么您应该在您的问题中提到它的相关信息。当你问一个问题时,你应该总是试着展示你尝试了什么(你做了),以及你尝试时得到了什么结果(忽略了那个部分)。还要确保在问题本身中包含新的信息,而不仅仅是评论。默认情况下,人们在手机上浏览时看到的评论要比在网络上浏览时少得多,只有几条向上投票的评论,你最后的回复就会出现在“点击查看更多”屏幕上。(还是一个很好的问题,我投了赞成票,如果我知道答案,我也会回答)谢谢你的反馈……你完全正确,我已经在问题中添加了我的“结果”。
public class MyContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public IAsyncDbSet<Customer> CustomersAsync { get { return new DbSetAdapter<Customer>(Customers); } }
}