使用 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>
期望:
- 执行应用程序中使用 XyzDBContext 的部分应该会导致创建数据库 "XyzDatabase"(如有必要)。
- 执行应用程序中使用 Membership Provider 的部分应该会导致创建数据库 "aspnet-Xyz-20150131102119"(如有必要)。
实际结果:
- 抛出异常:System.Data.ProviderIncompatibleException“一个
从数据库获取提供者信息时出错。
这可能是由于 Entity Framework 使用不正确的连接造成的
细绳。检查内部异常的详细信息并确保
连接字符串正确。”
- 内部异常:
System.Data.ProviderIncompatibleException“供应商没有
return 一个 ProviderManifestToken 字符串。”
- 内部异常:
System.Data.SqlClient.SqlException“用户登录失败
'DOMAIN\SERVER$'."
措施:
- 我尝试使用 SQL Server Management Studio 为 "DOMAIN\SERVER$" 用户添加登录,但登录总是失败。
- 我已经研究并尝试了连接字符串的许多排列组合,除了我发现的一些示例之外,所有示例都用于 SQL 服务器“3xpr355”。
好吧,如果您将每个连接字符串(数据库)映射到它自己的 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 服务器实例上看到一个新数据库。
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>
期望:
- 执行应用程序中使用 XyzDBContext 的部分应该会导致创建数据库 "XyzDatabase"(如有必要)。
- 执行应用程序中使用 Membership Provider 的部分应该会导致创建数据库 "aspnet-Xyz-20150131102119"(如有必要)。
实际结果:
- 抛出异常:System.Data.ProviderIncompatibleException“一个 从数据库获取提供者信息时出错。 这可能是由于 Entity Framework 使用不正确的连接造成的 细绳。检查内部异常的详细信息并确保 连接字符串正确。”
- 内部异常: System.Data.ProviderIncompatibleException“供应商没有 return 一个 ProviderManifestToken 字符串。”
- 内部异常: System.Data.SqlClient.SqlException“用户登录失败 'DOMAIN\SERVER$'."
措施:
- 我尝试使用 SQL Server Management Studio 为 "DOMAIN\SERVER$" 用户添加登录,但登录总是失败。
- 我已经研究并尝试了连接字符串的许多排列组合,除了我发现的一些示例之外,所有示例都用于 SQL 服务器“3xpr355”。
好吧,如果您将每个连接字符串(数据库)映射到它自己的 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 服务器实例上看到一个新数据库。