繁体   English   中英

在数据库优先的ASP.NET MVC4项目中将SimpleMembershipProvider与我自己的数据库一起使用

[英]Using SimpleMembershipProvider with my own database in a Database-First ASP.NET MVC4 project

我有一个数据库优先的ASP.NET MVC 4项目,并希望将SimpleMembershipProvider与我数据库中的自定义user_info表一起使用。 我将Entitiy Framework 6与SQL Server一起使用。 我已经在互联网和SO上寻找解决方案,但是没有运气。

我的user_info表如下所示:

[Id]            INT            IDENTITY (1, 1) NOT NULL,
[email]         NVARCHAR (MAX) NULL,
[first_name]    NVARCHAR (MAX) NULL,
[last_name]     NVARCHAR (MAX) NULL,
[internal_role] INT            NULL,
CONSTRAINT [PK_user_info] PRIMARY KEY CLUSTERED ([Id] ASC)

我尝试遵循如何自定义简单的成员资格提供程序以与自己的数据库ASP.NET mvc 4结合使用的步骤 ,但是我认为此方法不适用于非Code-First项目。 我收到服务器错误“找不到所需的.Net Framework数据提供程序。它可能未安装。” 当我尝试将以下代码添加到功能SimpleMembershipInitializer()时。

WebSecurity.InitializeDatabaseConnection("ReservationSystemEntities", "user_info", "Id", "email", autoCreateTables: true);

这是我的Web.config文件中的相关信息:

<configSections>
  <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=xxxxxx" requirePermission="false" />
</configSections>

<connectionStrings>
<add name="ReservationSystemEntities" connectionString="metadata=res://*/ReservationSystem.csdl|res://*/ReservationSystem.ssdl|res://*/ReservationSystem.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(localdb)\v11.0;initial catalog=ReservationSystem;integrated security=True;user id=xxxxx;password=xxxxx;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  <providers>
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  </providers>
</entityFramework>

根据以下答案,我什至不确定是否可行: SimpleMembershipInitializer无法初始化

基于此答案, 将MVC 4 SimpleMembership与现有的数据库优先EF模型结合使用,我需要指定如下连接字符串:

<add name="CONNECTION_STRING_NAME" connectionString="data source=SERVER;initial catalog=DATABASE;user id=USER;password=PASSWORD;" providerName="System.Data.SqlClient" />

我不确定如何将我的连接字符串转换为这样的连接字符串。 仅当使用Code-First时,这种类型的连接字符串不是有效的吗?

任何帮助将非常感激。

我终于找到答案了! 有关原始问题/答案,请参阅先将EF模型与SimpleMembership一起使用

SimpleMembership可以首先使用模型/数据库。 解决方法如下:

1.来自MVC 4 Internet应用程序Templete的InitializeSimpleMembershipAttribute.cs应该看起来像这样

namespace WebAndAPILayer.Filters
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
    {
        private static SimpleMembershipInitializer _initializer;
        private static object _initializerLock = new object();
        private static bool _isInitialized;

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // Ensure ASP.NET Simple Membership is initialized only once per app start
            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
        }

        private class SimpleMembershipInitializer
        {
            public SimpleMembershipInitializer()
            {
                try
                {
                    WebSecurity.InitializeDatabaseConnection("ConnStringForWebSecurity", "UserProfile", "Id", "UserName", autoCreateTables: true);
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException("Something is wrong", ex);
                }
            }
        }
    }
}

2从AcountModel.cs CodeFirst类

3.修复AccountCotroler.cs以使用您的模型优先DbContext( ExternalLoginConfirmation(RegisterExternalLoginModel model, string returnUrl)方法)

4.定义您的"ConnStringForWebSecurity"连接字符串,该字符串与用于模型优先数据库访问的时髦conn字符串不同,请注意,我们使用提供程序System.Data.SqlClient而不是System.Data.EntityClient

 <connectionStrings>
         <add name="ModelFirstEntityFramework" connectionString="metadata=res://*/Context.csdl|res://*/Context.ssdl|res://*/Context.msl;provider=System.Data.SqlClient;provider
 connection string=&quot;data source=.\SQLEXPRESS;Initial
 Catalog=aspnet-MVC4;Integrated
 Security=SSPI;multipleactiveresultsets=True;App=EntityFramework&quot;"
 providerName="System.Data.EntityClient" />
         <add name="ConnStringForWebSecurity" connectionString="data source=.\SQLEXPRESS;Initial Catalog=aspnet-MVC4;Integrated
 Security=SSPI" providerName="System.Data.SqlClient" />
       </connectionStrings>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM