entity frameworkRC1 DbContext查询问题

我正在尝试使用entity framework代码首先实现存储库模式rc 1.我遇到的问题是创建DbContext。 我有一个解决IRepository的ioc容器,它有一个contextprovider,它只是在windsor.config文件中用连接字符串通知新的DbContext。 使用linq2sql这部分没问题,但EF似乎很窒息。 我将通过一个例子来描述下面的问题。 我已经拿出代码来简化一些事情,这就是为什么你在这里看不到任何存储库模式的东西。 只是在没有所有额外代码和类的情况下排序正在发生的事情。

using (var context = new PlssContext()) { var x = context.Set(); var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault(); } using (var context2 = new DbContext(@"Data Source=.\SQLEXPRESS;Initial Catalog=PLSS.Models.PlssContext;Integrated Security=True;MultipleActiveResultSets=True")) { var x = context2.Set(); var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault(); } 

PlssContext是我创建DbContext类的地方。 存储库模式对PlssContext一无所知。 我认为我能做的最好的事情就是使用连接字符串创建一个DbContext到sqlexpress数据库并以这种方式查询数据。 在新建了PlssContext对象之后,从上下文中获取了var context2中的连接字符串。 所以他们指向同一个sqlexpress数据库。

第一个查询有效。 第二个查询因此错误而失败:

自创建数据库以来,支持’DbContext’上下文的模型已更改。 手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer。 例如,DropCreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定。

在这条线上

 var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault(); 

这是我的DbContext

 namespace PLSS.Models { public class PlssContext : DbContext { public DbSet Users { get; set; } public DbSet Corners { get; set; } public DbSet Lookup_County { get; set; } public DbSet Lookup_Accuracy { get; set; } public DbSet Lookup_MonumentStatus { get; set; } public DbSet Lookup_CoordinateSystem { get; set; } public class Initializer : DropCreateDatabaseAlways { protected override void Seed(PlssContext context) { 

我尝试了所有的初始化策略都有相同的错误。 我不认为数据库正在改变。 如果我删除了

  modelBuilder.Conventions.Remove(); 

然后错误返回

实体类型User不是当前上下文的模型的一部分。

哪种有道理。 但是你怎么把这一切都结合在一起呢?

这是正确的行为。 普通的DbContext不知道映射(=不知道你的任何实体)。 这就是为什么你应该总是创建派生上下文的原因。 您的存储库不知道PlssContext但您仍然可以注入它:

 public class Repository { private readonly DbContext _context; public Repository(DbContext context) { _context = context; } ... } var repository = new Repository(new PlssContext()); 

首先使用代码时,不能直接使用基本DbContext实例。