2

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

哪种是有道理的。但是你如何把这一切结合在一起呢?

4

1 回答 1

4

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

public class Repository
{
  private readonly DbContext _context;

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

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

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

于 2011-03-17T08:40:50.217 回答