'System.Web.Security.SqlMembershipProvider'需要与架构版本'1'兼容的数据库架构

时间:2010-07-20 17:46:32

标签: asp.net sql

我有一个SQL Server 2008数据库,其中有许多表填充了数据,我使用SQL Server Management Studio通过脚本向导生成SQL转储:任务 - >生成脚本 - >脚本所选数据库中的所有对象,还选择脚本数据选项。我确保将“Script for Server Version”的值更改为“SQL Server 2008”。然后我创建了一个新数据库,并在新数据库上运行SQL转储,以生成旧数据库的相同副本。然后我将默认用户的权限分配给新数据库。然后我更改了ASP.NET应用程序上的连接字符串以使用新数据库。但是当我运行它时,它会抛出以下异常 -

            Server Error in '/myapp' Application.
            The 'System.Web.Security.SqlMembershipProvider' requires a database schema compatible with schema version '1'.  However, the current database schema is not compatible with this version.  You may need to either install a compatible schema with aspnet_regsql.exe (available in the framework installation directory), or upgrade the provider to a newer version.
            Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

            Exception Details: System.Configuration.Provider.ProviderException: The 'System.Web.Security.SqlMembershipProvider' requires a database schema compatible with schema version '1'.  However, the current database schema is not compatible with this version.  You may need to either install a compatible schema with aspnet_regsql.exe (available in the framework installation directory), or upgrade the provider to a newer version.

            Source Error:

            An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

            Stack Trace:

            [ProviderException: The 'System.Web.Security.SqlMembershipProvider' requires a database schema compatible with schema version '1'.  However, the current database schema is not compatible with this version.  You may need to either install a compatible schema with aspnet_regsql.exe (available in the framework installation directory), or upgrade the provider to a newer version.]
               System.Web.Util.SecUtility.CheckSchemaVersion(ProviderBase provider, SqlConnection connection, String[] features, String version, Int32& schemaVersionCheck) +1977772
               System.Web.Security.SqlMembershipProvider.CheckSchemaVersion(SqlConnection connection) +89
               System.Web.Security.SqlMembershipProvider.GetPasswordWithFormat(String username, Boolean updateLastLoginActivityDate, Int32& status, String& password, Int32& passwordFormat, String& passwordSalt, Int32& failedPasswordAttemptCount, Int32& failedPasswordAnswerAttemptCount, Boolean& isApproved, DateTime& lastLoginDate, DateTime& lastActivityDate) +815
               System.Web.Security.SqlMembershipProvider.CheckPassword(String username, String password, Boolean updateLastLoginActivityDate, Boolean failIfNotApproved, String& salt, Int32& passwordFormat) +105
               System.Web.Security.SqlMembershipProvider.CheckPassword(String username, String password, Boolean updateLastLoginActivityDate, Boolean failIfNotApproved) +42
               System.Web.Security.SqlMembershipProvider.ValidateUser(String username, String password) +78
               System.Web.UI.WebControls.Login.AuthenticateUsingMembershipProvider(AuthenticateEventArgs e) +60
               System.Web.UI.WebControls.Login.OnAuthenticate(AuthenticateEventArgs e) +119
               System.Web.UI.WebControls.Login.AttemptLogin() +115
               System.Web.UI.WebControls.Login.OnBubbleEvent(Object source, EventArgs e) +101
               System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
               System.Web.UI.WebControls.Button.OnCommand(CommandEventArgs e) +118
               System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +166
               System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
               System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
               System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
               System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

12 个答案:

答案 0 :(得分:103)

我找到了一种非常简单的方法,只需将此数据粘贴到aspnet_SchemaVersions

中即可
common              1   True
health monitoring   1   True
membership          1   True
personalization     1   True
profile             1   True
role manager        1   True

我必须使用一些空格来使数据对齐,忽略空格

答案 1 :(得分:47)

如果你真的没有忘记任何事情(观点,SP等等),那么谷歌搜索表明'愚蠢'的解决方案,如关闭项目,重新开放,重建,或:

真正做到这一点的是通过ASP.NET配置实用程序(Visual Studio - 在“网站”菜单下),使应用程序脱机然后重新联机。这实际上只是对web.config进行了更改(不完全确定更改是什么)。因此,在将其脱机后,我必须将web.config上传到托管解决方案。然后将应用程序重新联机,重新复制web.config等

可能是答案。

答案 2 :(得分:36)

我有类似的问题,我能够解决它将默认值添加到表aspnet_SchemaVersions。 此默认值未添加到使用任务生成的数据库中 - >生成脚本。

这是一个有用的post

INSERT INTO dbo.aspnet_SchemaVersions 
VALUES
('common', 1, 1),
('membership', 1, 1),
('role manager', 1, 1);
GO

答案 3 :(得分:13)

重启应用程序池对我有用

答案 4 :(得分:6)

我根本不是SQL或ASP.net的大师或程序员,偶然得到了这份工作,但我遇到了同样的问题而且这个错误很愚蠢:

在我的Web.Conf中,连接字符串通常看起来像这样:

<add name="AgriConnectionString" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=AgriBranch; pooling=true; Connection Timeout=120; Integrated Security=false;Persist Security Info=True; User ID=UserID; Password=PASS***WORD" providerName="System.Data.SqlClient" />

然而昨天我意外地将我的来源看作"Data Source=./SQLEXPRESS"

我得到了与讨论相同的错误。

这个错误也可以解释为什么当使用Visual Studio的实用程序使站点脱机并重新联机时,或者重新编译时会解决错误。

答案 5 :(得分:5)

尝试使用正确版本的System.Web.Security.SqlRoleProvider更新Web配置文件

您可以在c:/windows/microsoft.net/framework/v4.0.30319或任何其他版本中找到以下配置,您可以在那里找到配置文件。进入它检查机器配置文件 得到版本&amp;公钥。

对于.net frameowork 4.0

     <roleManager enabled="true" defaultProvider="SqlProvider">
     <providers>
        <clear/>
        <add name="SqlProvider" connectionStringName="rolesDB" applicationName="/" type="System.Web.Security.SqlRoleProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
     </providers>
  </roleManager>

for .net framework 2.0

    <roleManager enabled="true" defaultProvider="SqlProvider">
     <providers>
        <clear/>
        <add name="SqlProvider" connectionStringName="rolesDB" applicationName="/" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
     </providers>
  </roleManager>

答案 6 :(得分:3)

您可能必须运行aspnet_regsql.exe才能填充架构值。您可以对值进行硬编码,只要您拥有所有生成的对象(表,视图,sproc等等)。

我采取的解决这个问题的步骤是:

重新运行aspnet_regsql.exe 确保那里的默认值 重启IIS。

然后它工作..

但是如果只是复制没有值的数据库模式,则需要运行“aspnet_regsql.exe”以填充默认值。

该文件可以在这里找到(re:msdn): [drive:] \%windir%\ Microsoft.NET \ Framework \ version(它在2.0目录中)

这里有一些信息:
http://msdn.microsoft.com/en-us/library/ms229862%28v=vs.80%29.aspx

答案 7 :(得分:1)

就我而言,上述解决方案均无效。

我从webconfig中的memnership provider中删除了applicationName =“/”,这是由visual studio创建的,然后将其上传到服务器。

或者您可以手动创建aspnet_Applications表中的应用程序行。

有一个很好的编码!

答案 8 :(得分:1)

我尝试了上面的许多选项,但当时没有一个选项可以解决这个问题(虽然他们可能有帮助但我没有意识到这一点。)

我采取的最后一步[有效]是在我的连接字符串中授予SQL用户访问aspnet_regsql.exe安装的aspnet_ *角色。我的SQL用户在数据库中被设置为db_owner,但不是系统管理员 - 不确定这是否重要。

一旦我这样做,并且之后我已经尝试了上面的一些选项,一切都很顺利。

答案 9 :(得分:0)

忘记在我的新数据库上运行aspreg_sql后,我第一次收到此错误。完成后,我收到此错误,直到我关闭Cassini或ASP.NET开发服务器。重新运行,它工作正常。

答案 10 :(得分:0)

这基本上是在您复制/通过完整的网站解决方案时。应单独配置SQL Server的ASP.NET配置。这意味着您应该从Visual Studio命令提示符运行aspnet_regsql,并在向导期间按照说明进行操作。

答案 11 :(得分:0)

旧帖子,但我有一个替代解决方案。

我的web.config中的连接字符串包含Persist Security Info=True;。删除它解决了错误。