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
实例。