如何用ApplicationDbContext创建一个接口类?

时间:2014-10-03 02:13:34

标签: c# linq entity-framework dbcontext

我正在尝试使用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不包含'Users'的定义,也没有扩展方法'Users'......

我想我在这里错过了一个关键概念。

你能帮助我吗?

1 个答案:

答案 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_inheritancehttp://en.wikipedia.org/wiki/Information_hiding了解详情。