使用 Entity Framework 和 SQL Server 2012 的代码优先 MVC 4

Code-first MVC 4 using Entity Framework and SQL Server 2012

This question is not about SQL Server "3xpr355" (the obfuscation in quotes is by design; it should prevent future searches from hitting dead-ends, as mine have done).


我正在使用代码优先和 Entity Framework 来开发 MVC 4 应用程序。 SQL 服务器、IIS 和 Visual Studio 都在同一台机器上 运行。

我最初使用的是 SQL 服务器“3xpr355”,但由于需要将它放在通过 ISS 暴露在互联网上的机器上,因此需要将它连接到一个功能齐全的 SQL 需要服务器。我将应用程序设置为在模型更改时删除并重新创建数据库:

public class XyzDBContext : DbContext
{
    public XyzDBContext()
        : base("XyzDBContext")
    {
        Database.SetInitializer<XyzDBContext>(new DropCreateDatabaseIfModelChanges<XyzDBContext>());
    }

    public DbSet<XyzModel> XyzModels{ get; set; }
}

这是我的连接字符串:

<connectionStrings>
 <add 
  name="DefaultConnection" 
  connectionString="Data Source=.;Initial Catalog=aspnet-Xyz-20150131102119;Integrated Security=SSPI" 
  providerName="System.Data.SqlClient" />
 <add
  name="XyzDBContext"
  connectionString="Data Source=.;Initial Catalog=XyzDatabase;Integrated Security=True"
  providerName="System.Data.SqlClient"/>
</connectionStrings>

期望:

实际结果:

措施:

好吧,如果您将每个连接字符串(数据库)映射到它自己的 DbContext,您可以达到您的期望,但您仍然必须使用两个上下文(这很痛苦)。
您的第三个实际结果是由于无法连接到数据库的 IIS。您必须转到 IIS 管理器并更改应用程序运行所在的应用程序池的标识(您可以将其更改为 LocalSystem)
最后,如果您已经创建了数据库,请尝试此操作:

public class DefaultConnectionContext : DbContext, IDisposable
    {
        public DefaultConnectionContext()
            : base("name=DefaultConnection")
        {
            Database.SetInitializer<DefaultConnectionContext>(null);
        }

        // Some dbsets

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }

public class XyzDBContext : DbContext, IDisposable
    {
        public XyzDBContext()
            : base("name=XyzDBContext")
        {
            Database.SetInitializer<XyzDBContext>(null);
        }

        // Some dbsets

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }

希望对你有帮助

这个问题的解决方案是多方面的:

创建应用程序池

在 IIS 管理器中,访问 "Application Pools" 节点和 select "Add Application Pool..." 操作:

Select 新的应用程序池和 select "Advanced Settings..." 操作,然后 select “...”按钮(在 "Identity" 字段上):

将应用程序池标识设置为 "LocalSystem"

授予权限

在SQL Server Management Studio(连接到数据库服务时)中,访问"Logins"下的"NT AUTHORITY\SYSTEM"节点并调出"Properties"视图,然后select "Server Roles" 页面,并通过 select 复选框授予所有权限:

在 IIS 管理器中,右键单击您的站点,然后 select "Manage Application/Advanced Settings..." 并将 "Application Pool" 属性 值设置为 "CodeFirstMVC"。

运行 应用

运行 应用程序并访问需要创建新数据库的区域;您现在应该在 SQL 服务器实例上看到一个新数据库。