我正在尝试使用实体框架代码首先实现存储库模式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一无所知。我认为我能做的最好的事情就是使用连接字符串创建一个DbContext到sqlexpress数据库并以这种方式查询数据。在更新PlssContext对象后,从上下文中获取了var context2中的连接字符串。所以他们指向同一个sqlexpress数据库。
第一个查询有效。第二个查询因此错误而失败:
支持'DbContext'的模型 自数据库以来,上下文已经改变 创建了。手动 删除/更新数据库,或者调用 Database.SetInitializer with IDatabaseInitializer实例。对于 例如, 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)
{
我尝试过所有的初始化策略都有相同的错误。我不认为数据库正在发生变化。如果我删除
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
然后错误返回
实体类型User不是当前上下文的模型的一部分。
哪种有道理。但是你怎么把这些结合在一起呢?
答案 0 :(得分:4)
这是正确的行为。普通DbContext
不了解映射(=不知道您的任何实体)。这就是为什么你应该总是创建派生上下文的原因。您的存储库不知道PlssContext
,但您仍然可以像下面这样注入:
public class Repository
{
private readonly DbContext _context;
public Repository(DbContext context)
{
_context = context;
}
...
}
var repository = new Repository(new PlssContext());
首先使用代码时,不能直接使用基础DbContext
实例。