我试图先使用实体​​框架代码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与
  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>();


然后错误返回是


  实体类型用户不是当前上下文模型的一部分。


哪种有意义。但是如何将所有这些结合在一起?

最佳答案

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

public class Repository
{
  private readonly DbContext _context;

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

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


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

10-06 13:26
查看更多