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();
}
private ApplicationDbContext ctx = new ApplicationDbContext();
ctx.Users.somthing() works
private IApplicationDbContext ctx = new ApplicationDbCOntext();
ctx.Users.something..
我想我在这里错过了一个关键概念。
你能帮助我吗?答案 0 :(得分:1)
如果您将ctx
视为IApplicationDbContext
的实例,那么您只需在IApplicationDbContext
界面中了解这些内容即可了解您的意图,无论接口的具体实现恰好是。
如果您想要同时访问IdentityDbContext<ApplicationUser>
成员和 IApplicationDbContext
成员,则需要对类似这两种内容的类型进行delcare,例如:你的ApplicationDbContext
课程。
或者,最好不要在IdentityDbContext<ApplicationUser>
的具体实现中扩展ApplicationDbContext
,而是遵循优先考虑组合而不是继承的原则,并允许ApplicationDbContext
拥有一个实例IdentityDbContext<ApplicationUser>
,例如
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/Information_hiding了解详情。