【问题标题】:Code-first MVC 4 using Entity Framework and SQL Server 2012使用实体框架和 SQL Server 2012 的代码优先 MVC 4
【发布时间】:2015-04-12 02:21:33
【问题描述】:

这个问题不是关于 SQL Server“3xpr355”(混淆 引号是设计使然;它应该防止将来的搜索命中 死胡同,就像我的一样)。


我正在使用代码优先和实体框架来开发 MVC 4 应用程序。 SQL Server、IIS 和 Visual Studio 都在同一台机器上运行。

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

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 "An 从数据库获取提供者信息时出错。 这可能是由 Entity Framework 使用不正确的连接引起的 细绳。检查内部异常以了解详细信息并确保 连接字符串正确。”
  • 内部异常: System.Data.ProviderIncompatibleException "提供者没有 返回一个 ProviderManifestToken 字符串。”
  • 内部异常: System.Data.SqlClient.SqlException“用户登录失败 'DOMAIN\SERVER$'。”

措施:

  • 我曾尝试使用 SQL Server Management Studio 为“DOMAIN\SERVER$”用户添加登录名,但登录总是失败。
  • 我已经研究并尝试了许多连接字符串的排列方式,除了少数几个我发现的示例之外,所有示例都用于 SQL Server“3xpr355”。

【问题讨论】:

    标签: sql-server asp.net-mvc login connection-string code-first


    【解决方案1】:

    如果您将每个连接字符串(数据库)映射到它自己的 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);
            }
        }
    

    希望对你有帮助

    【讨论】:

    • 感谢应用程序池的建议;它不是开箱即用的,但它使我朝着新的方向努力。请从您的回答中删除“3xpr355”的未混淆提及,我会投票认为它有帮助。
    • 很高兴我能帮上忙,几周前我遇到了同样的问题,更改应用程序池的身份解决了它,方法如下:technet.microsoft.com/en-us/library/cc771170%28v=ws.10%29.aspx
    【解决方案2】:

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

    创建应用程序池

    在 IIS 管理器中,访问“应用程序池”节点并选择“添加应用程序池...”操作:

    选择新的应用程序池并选择“高级设置...”操作,然后选择“...”按钮(在“身份”字段上):

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

    授予权限

    在 SQL Server Management Studio 中(连接到数据库服务时),访问“登录”下的“NT AUTHORITY\SYSTEM”节点并调出“属性”视图,然后选择“服务器角色”页面,并授予通过选中复选框获得所有权限:

    在 IIS 管理器中,右键单击您的站点并选择“管理应用程序/高级设置...”并将“应用程序池”属性值设置为“CodeFirstMVC”。

    运行应用程序

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

    【讨论】:

    • 这就是我的答案!很高兴我能帮上忙
    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多