我正在尝试从 ApplicationDbContext 中创建一个扩展 IdentityDbContext 的接口。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>,
IApplicationDbContext
{
public ApplicationDbContext()
: base("AppContext")
{
}
// Should I add below line? without any unwanted behavior?
// public DbSet<ApplicationUser> User { get; set;}
public DbSet<Book> Books { get; set; }
}
我的界面将是
public interface IApplicationDbContext : IDisposable
{
// Should I add below line?
// DbSet<ApplicationUser> User { get;}
DbSet<Book> Books { get; }
int SaveChanges();
}
这种方法的问题是我失去了对来自 IdentityDbContext.Users 的“用户”的访问权限
private ApplicationDbContext ctx = new ApplicationDbContext();
ctx.Users.somthing() works
但在下面,编译器抱怨
private IApplicationDbContext ctx = new ApplicationDbCOntext();
ctx.Users.something..
IApplicationDbContext 不包含“用户”的定义,并且没有扩展方法“用户”...
我想我在这里遗漏了一个关键概念。
你愿意帮我吗?
如果你声明ctx
作为一个例子IApplicationDbContext
你声明你的意图是你只想知道这些事情IApplicationDbContext
接口,无论接口的具体实现是什么。
如果您想访问两者IdentityDbContext<ApplicationUser>
会员and IApplicationDbContext
成员,您需要声明一个兼具这两者的类型,例如你的ApplicationDbContext
class.
或者,最好不要延长IdentityDbContext<ApplicationUser>
在你的具体实施中ApplicationDbContext
,您可以遵循优先组合而不是继承的原则,并允许ApplicationDbContext
拥有一个实例IdentityDbContext<ApplicationUser>
, e.g.
public class ApplicationDbContext : IApplicationDbContext
{
private readonly IdentityDbContext<ApplicationUser> _dbContext;
public IDbSet<ApplicationUser> Users { get { return _dbContext.Users; } }
public ApplicationDbContext(IdentityDbContext<ApplicationUser> dbContext)
{
_dbContext = dbContext;
}
public DbSet<Book> Books { get; set; }
}
并且,如果需要,可以更改接口定义以提供Users
财产。这使您仍然可以访问您需要的信息,同时隐藏您不需要的信息。看
http://en.wikipedia.org/wiki/Composition_over_inheritance http://en.wikipedia.org/wiki/Composition_over_inheritance and http://en.wikipedia.org/wiki/Information_hiding http://en.wikipedia.org/wiki/Information_hiding了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)