我正在尝试首先使用实体框架代码 rc 1 来实现存储库模式。我遇到的问题是创建 DbContext。我有一个解析 IRepository 的 ioc 容器,它有一个 contextprovider,它只是用 windsor.config 文件中的连接字符串通知一个新的 DbContext。使用 linq2sql 这部分没问题,但 EF 似乎令人窒息。我将在下面用一个例子来描述这个问题。我已经提取了代码以简化一些事情,这就是为什么您在这里看不到任何存储库模式的东西。只是排序没有所有额外代码和类的情况。
using (var context = new PlssContext())
{
var x = context.Set<User>();
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<User>();
var y = x.Where(u => u.UserName == LogOnModel.UserName).FirstOrDefault();
}
PlssContext 是我创建 DbContext 类的地方。存储库模式对 PlssContext 一无所知。我认为我能做的最好的事情是创建一个带有到 sqlexpress 数据库的连接字符串的 DbContext 并以这种方式查询数据。var context2 中的连接字符串是在更新 PlssContext 对象后从上下文中获取的。所以他们指向同一个 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<User> Users { get; set; }
public DbSet<Corner> Corners { get; set; }
public DbSet<Lookup_County> Lookup_County { get; set; }
public DbSet<Lookup_Accuracy> Lookup_Accuracy { get; set; }
public DbSet<Lookup_MonumentStatus> Lookup_MonumentStatus { get; set; }
public DbSet<Lookup_CoordinateSystem> Lookup_CoordinateSystem { get; set; }
public class Initializer : DropCreateDatabaseAlways<PlssContext>
{
protected override void Seed(PlssContext context)
{
我已经尝试了所有具有相同错误的 Initializer 策略。我不认为数据库正在改变。如果我删除
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
然后错误返回是
实体类型 User 不是当前上下文模型的一部分。
哪种是有道理的。但是你如何把这一切结合在一起呢?