WebSecurity.InitializeDatabaseConnection - 如何指定数据库模式?

时间:2011-06-05 16:14:43

标签: asp.net webmatrix

我正在使用SimpleMembership(http://blog.osbornm.com/archive/2010/07/21/using-simplemembership-with-asp.net-webpages.aspx),但我无法将自定义用户表放在除dbo之外的架构中。

例如,此调用将固执地创建一个名为“dbo.MySchema.User”的表

WebSecurity.InitializeDatabaseConnection(connectionStringName: "ApplicationServices", userTableName: "MySchema.User", userIdColumn: "ID", userNameColumn: "Username", autoCreateTables: true);

我也尝试手动创建表,但是在运行查询时,库仍然会尝试附加“dbo”。

我需要自定义提供商吗?我不是100%肯定我是否会使用SimpleMembership,但它可以省去编写一堆用户/授权代码的麻烦。

http://msdn.microsoft.com/en-us/library/gg569134(v=VS.99).aspx

4 个答案:

答案 0 :(得分:8)

我为用户使用自己的架构。

我的表名为CORE.PROFILES,使用websecurity我有一个SQL同义词dbo.PROFILES

要在SQL Server中运行此语句:

CREATE SYNONYM dbo.profiles FOR core.profiles;

我希望这对你有所帮助。

答案 1 :(得分:4)

WebMatrix.WebData程序集的2.0.0.0版生成其create table语句,如下所示。

"CREATE TABLE " + this.SafeUserTableName + "(" + this.SafeUserIdColumn + " int NOT NULL PRIMARY KEY IDENTITY, " + this.SafeUserNameColumn + " nvarchar(56) NOT NULL UNIQUE)"

SafeUserTableName具有以下实施方式。

return "[" + this.UserTableName + "]";

正如@anderly所假设的那样,结果将是表格将在连接字符串中的用户的默认架构中创建。

出于同样的原因,在运行时,SafeUserTableName方法的实现会导致UserTableName参数的全部内容被解释为表名 - 在默认模式中。

因此,SimpleMembershipProvider要求用户表处于默认架构中。

答案 2 :(得分:4)

试试这个:

WebSecurity.InitializeDatabaseConnection(connectionStringName: "ApplicationServices", userTableName: "MySchema].[User", userIdColumn: "ID", userNameColumn: "Username", autoCreateTables: true);

答案 3 :(得分:0)

我认为关键是它将使用与您的用户ID关联的默认架构。在SQL Server中,您可以尝试为您的用户帐户指定除dbo之外的默认架构,然后我认为它将在该架构中创建表,但我认为您不能在调用InitializeDatabaseConnection时指定架构。