实体框架RC1 DbContext查询问题

时间:2011-03-17 01:28:14

标签: c# entity-framework repository-pattern ef-code-first entity-framework-4.1

我正在尝试使用实体框架代码首先实现存储库模式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不是当前上下文的模型的一部分。

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

1 个答案:

答案 0 :(得分:4)

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

public class Repository
{
  private readonly DbContext _context;

  public Repository(DbContext context)
  {
    _context = context;
  }
  ...
}

var repository = new Repository(new PlssContext());

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