【问题标题】:The model backing the 'MyContext' context has changed since the database was created自创建数据库以来,支持“MyContext”上下文的模型已更改
【发布时间】:2016-03-23 13:28:26
【问题描述】:

运行单元测试时出现以下错误(支持“MyContext”上下文的模型自创建数据库以来已更改)

在我的上下文构造函数中,我设置了

Database.SetInitializer<MyContext>(null);

在我的单元测试中,我正在模拟上下文。我也将此代码添加到单元测试中,但它仍然失败。除了Database.SetInitializer&lt;MyContext&gt;(null);,还有什么需要做的吗

我的上下文在这里

 public class MyContext : DbContext
  {
    public MyContext () : base("MyContext") 
    {
      Database.SetInitializer<MyContext>(null);
    }

    public virtual DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<User>().ToTable("Users");
    }
  }

我在单元测试中的 Mock

  var _context = new Mock<MyContext>();
  Database.SetInitializer<MyContext>(null);
  _classUnderTest = new Repo(_context.Object);

我在这里得到错误

  _context.Entry(user).State = EntityState.Added; 

【问题讨论】:

  • 您的 Mock 模型不反映数据库的状态。检查 Mock 是否真的与真实的 DB 模型完全匹配。

标签: c# entity-framework ef-code-first code-first


【解决方案1】:

我不确定我是否理解了这个问题,但如果您使用的是实体框架代码优先方法,在模型更改后,请尝试在您的应用程序中启用迁移。可以使用包管理器控制台来完成。

更多详情请参考此链接。MSDN link

【讨论】:

  • 嗨我不想要迁移这就是我设置 Database.SetInitializer(null);但我仍然收到迁移错误
【解决方案2】:

事实证明,如果没有提供连接字符串,EF 将默认连接到 sql express。所以解决这个问题的方法不是模拟上下文,而是从上下文中提取一个接口并模拟它。事实证明,MSDN 上的示例非常糟糕,因为它们模拟了实际上下文而不是抽象。

https://msdn.microsoft.com/en-us/library/dn314429.aspx?f=255&MSPPError=-2147217396

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2011-04-05
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多