簡體   English   中英

為SimpleMembership設置有效的連接字符串

[英]Setup a valid connection string for SimpleMembership

我試圖為我的數據庫設置一個有效的連接字符串,以便我的WebSecurity.InitializeDatabaseConnection方法可以指向我的數據庫。

這是我的連接字符串:

<add name="Database_Entities1" connectionString="metadata=res://*/Models.DAL.Entities.MTG_Model.csdl|res://*/Models.DAL.Entities.MTG_Model.ssdl|res://*/Models.DAL.Entities.MTG_Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=**.**.***.***;initial catalog=Model_Name;persist security info=True;user id=*****;password=*********;multipleactiveresultsets=True;application name=EntityFramework;Pooling=True;Max Pool Size=1000&quot;" providerName="System.Data.EntityClient" />

這里的問題是提供者名稱為System.Data.EntityClient 實際上,我實際上需要它指向System.Data.SqlClient ,但是當我嘗試復制/粘貼連接字符串並將System.Data.EntityClient替換為其他提供程序名稱時,會出現諸如Keyword not supported: 'metadata'.崩潰Keyword not supported: 'metadata'.

所以我的理解是像這樣調用我的方法:

[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()
        {
            Database.SetInitializer<Database_Entities1>(null);

            try
            {
                using (var context = new Database_Entities1())
                {
                    if (!context.Database.Exists())
                    {
                        // Create the SimpleMembership database without Entity Framework migration schema
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                    }
                }

                WebSecurity.InitializeDatabaseConnection("Database_Entities2", "UserProfile", "UserId", "UserName", true);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
            }
        }
    }
}

其中Database_Entities2是:

<add name="Database_Entities2" connectionString="metadata=res://*/Models.DAL.Entities.MTG_Model.csdl|res://*/Models.DAL.Entities.MTG_Model.ssdl|res://*/Models.DAL.Entities.MTG_Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=**.**.***.***;initial catalog=Model_Name;persist security info=True;user id=*****;password=*********;multipleactiveresultsets=True;application name=EntityFramework;Pooling=True;Max Pool Size=1000&quot;" providerName="System.Data.SqlClient" />

不起作用,因為SqlClient連接字符串不起作用。 誰能幫助我實現我的目標? 非常感謝!

編輯

兩個附加信息:我有這個連接字符串:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MyApp-20130829080410;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-MyApp-20130829080410.mdf" providerName="System.Data.SqlClient" />

哪個在工作; 但是,正如您所看到的,它並不指向我的數據庫,因此,如果我嘗試檢索表“ UserProfile”中的任何用戶,則由於該表是在本地數據庫中創建的,所以這是不可能的(我不知道為什么我有),而不是在主數據庫(Database_Entities1)中,因此出現了這個問題。

SimpleMembershipProvider需要正常的連接字符串,而不是實體框架連接字符串。 您需要定義一個單獨的連接字符串,該字符串指向與您的實體框架連接字符串相同的數據庫,並使用該數據庫:

<add name="MembershipDB" 
    connectionString="Data Source=**.**.***.***;Initial Catalog=Model_Name;[...]" 
    providerName="System.Data.SqlClient" />

如果使用Entity Framework則連接字符串將由IDE創建。 從您的描述中,我想您是通過自己的方式而不是通過IDE創建了該連接字符串。

因此,IDE將在您的app.config中放置以下內容:

<add name="libraryEntities1" connectionString="metadata=res://*/privlibDBmodel.csdl|res://*/privlibDBmodel.ssdl|res://*/privlibDBmodel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=[yourserver];initial catalog=library;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

要在程序中創建連接,可以使用以下命令:

libraryEntities1 dbconn = new libraryEnitits1();

現在您可以通過dbcon對象處理連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM