【问题标题】:Entity Framwork 5 won't use my viewEntity Framework 5 不会使用我的视图
【发布时间】:2013-09-10 08:54:54
【问题描述】:

我使用 EF(代码优先)创建了一个 MVC 4 应用程序,该应用程序映射到我使用 SQL Management Studio 创建的表和视图的混合,效果很好。

我已经开始了一个新的 MVC 4 项目,其方式与第一个项目大致相同,使用的是完全不同的数据库,但这次我尝试使用映射到视图(而不是表)的模型时,例外情况是提出说“一个名为 xxx 的对象已经存在”。 SQL 分析器显示 EF 正在尝试为我的模型创建表。

我发现如果我删除视图,让 EF 从模型中创建表,然后手动删除表并用视图替换它们,应用程序将工作大约 2 分钟,从我的视图中读取和使用信息,但最终抛出了同样的异常。

我不知道这里发生了什么。

导致异常的代码是:

repository.Customers.OrderBy(c => c.AccountNumber);

模型在哪里:

public class Customer
{
    public int Id {get;set;}
    public string AccountNumber {get;set;}
    public string Name {get;set;}
}

【问题讨论】:

  • 这是在运行时还是在构建模式时?听起来您没有从上下文中释放对象,而是尝试重新添加。你能在你使用视图的地方显示代码吗?
  • 在运行时,视图第一次尝试检索数据时,分析器显示 EF 尝试创建表并遇到问题,因为存在具有该名称的对象(视图)。
  • 你能显示这段代码吗?听起来您没有正确释放对象。
  • “不释放对象”是什么意思?

标签: c# sql asp.net-mvc entity-framework ef-code-first


【解决方案1】:

好的 - 此问题的可能原因隐藏在您的上下文文件中。可能有一个类似于下面的语句试图在模型更改时更新您的数据库。

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyContext>(new DropCreateDatabaseIfModelChanges<MyContext>());
    }   

我一般不使用这种方法。我更喜欢删除数据库并使用包管理器控制台重新生成它。 (查看包管理器控制台的 update-database 方法)

【讨论】:

  • 我覆盖了该方法,让它什么也没做,问题仍然存在。是否有初始化程序指示 CF 不尝试调整数据库中的任何内容?
【解决方案2】:

使用 Greg 的提示,我能够到达我简单添加的点:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<MyContext>(null);
}

到上下文类,这已经解决了这个问题。我的理解是,我已经告诉 EF 不进行初始化,本质上是将其映射到在代码优先上下文之外维护的现有数据库。

我对 Greg 的回复投了赞成票,因为它是我需要的帮助,但创建了一个新的答案,因为上面最终解决了它。我希望这是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 2013-06-24
    • 2013-09-30
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    相关资源
    最近更新 更多