【问题标题】:Asp mvc 3 noobie: Why is the code-first method not building my DB on sql server?Asp mvc 3 noobie:为什么代码优先方法不在 sql server 上构建我的数据库?
【发布时间】:2012-08-13 19:16:00
【问题描述】:

我是一个做过一些教程的 ASP MVC 3 新手。现在我正在尝试建立一个网站。 microsoft 网站上的所有教程都强调代码优先方法:您使用代码定义模型,然后创建数据上下文,然后实体框架根据您的代码创建/管理数据库。

我设置了一个Employees 类和一个继承自DbContext 的DataBaseContext 类。我向 Web.config 连接字符串添加了一个连接字符串,该连接字符串成功地将 DataBaseContext 链接到 SQL 服务器上已经存在的空数据库。 EDIT= 这就是问题所在。请参阅下面的答案

但是当我尝试运行通过脚手架创建的员工控制器时,我得到了这个错误

Invalid object name 'dbo.Employees'. 
Description: An unhandled exception occurred during the execution of...
Exception Details: System.Data.SqlClient.SqlException: Invalid object name 'dbo.Employees'.

我关注了这篇帖子SqlException (0x80131904): Invalid object name 'dbo.Categories' 并意识到如果我在数据库上创建一个员工表,这个异常就会消失(我得到一个新的,说列名无效)。

但我认为 MVC 3 的全部意义在于该框架将根据代码为您创建数据库。

也许我需要 Global.asax Application_start() 中的一行代码来创建数据库?这是我的 application_start 方法:

Sub Application_Start()
    AreaRegistration.RegisterAllAreas()
    RegisterGlobalFilters(GlobalFilters.Filters)
    RegisterRoutes(RouteTable.Routes)
End Sub

这是员工的代码:

Public Class Employee

    Property EmployeeID As Integer
    Property First As String
    Property Last As String
    Property StartDate As DateTime
    Property VacationHours As Integer
    Property DateOfBirth As DateTime 'in case two employees have the same name

End Class

这是数据库上下文的代码:

Imports System.Data.Entity

Public Class DatabaseContext
    Inherits DbContext

    Public Property Employee As DbSet(Of Employee)
    Public Property AnnualLeave As DbSet(Of AnnualLeave)

End Class

我错过了什么?

【问题讨论】:

  • 您能否发布您为员工提供的模型类和 dbcontext 类。听起来您正在尝试使用实体框架代码优先,对吗?
  • @davidisawesome 我发布了附加代码
  • 我认为您不需要 app_start 中的任何内容。让我看一下,我会试着弄清楚。这是一个全新的项目,还是你已经搞砸的东西?
  • 全新项目。这可能是 sql server 权限或其他问题。我收到了一个 createTable not allowed 错误,但设法修复了那个错误。
  • 使用 localdb 作为连接字符串还是您设置的单独字符串?

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

默认情况下,EF 使用DropCreateDatabaseIfModelChanges<TContext> 数据库初始化程序。据MSDN

IDatabaseInitializer<TContext> 的实现,仅当模型在创建数据库后发生更改时,才会删除、重新创建和可选地重新为数据库播种数据。这是通过在创建时将存储模型的哈希写入数据库,然后将该哈希与从当前模型生成的哈希进行比较来实现的。

由于数据库是手动创建的,EF 找不到哈希并决定不执行任何进一步的初始化逻辑。

【讨论】:

    【解决方案2】:

    您可能想查看into this article,同样的问题已经成功回答。 或者可以是this(也解决成功) 您的问题的答案很可能是两者之一。

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      您为连接字符串指定的名称是否与数据库上下文的名称匹配?

      例如:

      上下文

      var myDbContext = new MyDbContext();
      

      连接字符串

      <connectionStrings> 
          <add name="MyDbContext" connectionString="YOUR.CONNECTION.STRING" providerName="System.Data.SqlServer" /> 
      </connectionStrings>
      

      【讨论】:

      • 感谢您的帮助。连接字符串名称和数据库上下文名称匹配,所以它必须是别的东西。
      【解决方案4】:

      试试看我写的这篇关于 DbContext with MVC 的文章是否适合你:Code-First

      要让它发挥作用,要做的事情并不多,但有些事情很容易错过,会导致一系列头痛。

      希望对你有帮助

      【讨论】:

      • 感谢您的链接。我在那里没有看到任何可以解释为什么数据库没有建立的东西。也许我需要在应用程序启动时添加一行来构建数据库?
      • 从我了解到的情况来看,如果您的 DbContext 设置正确并且它位于连接字符串中,那么当它第一次尝试访问需要该表的视图时,它应该构建它自动为你。您是否检查过实际数据库以查看它是否正在生成?
      【解决方案5】:

      我已经在 SQL 服务器上创建了一个具有该名称的数据库。一旦我删除了现有的数据库,代码优先框架就会为我创建表,就像它应该做的那样。似乎如果数据库已经存在,框架不会为您设置表。它想从头开始创建整个数据库。

      【讨论】:

        【解决方案6】:

        您使用的是AdventureWorks Database

        它有自己的架构分配给员工表。 HumanResources.Employees 而不是默认的 dbo.Employees

        即使我发现了问题,我也不知道使用HumanResources 架构配置的数据库的解决方案。

        有人知道吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-23
          相关资源
          最近更新 更多