2012-01-09 51 views
0

我是Silverlight的新手,我正在關注Silverlight for Business Applications教程。我已經使用ADO.NET實體模型和域服務連接了一個MDF文件,如視頻所示,所有這些工作都很好。Silverlight/ASP.NET - 使用ADO.NET /域服務動態指向數據庫

併發症來自需要動態指向數據庫。

在我的應用程序中,用戶將登錄。登錄後,程序將根據用戶定製體驗。這意味着我需要在認證之後從Silverlight應用程序中指向用戶特定的數據庫。

我已經想通過更改後面的代碼來更改模型的連接字符串,如下面的代碼所示。然而,我不太確定我可以使用它或者如何使用它來工作,因爲Silverlight應用程序和ASP.NET之間沒有直接的聯繫。

string fileName = string.Empty; 
void OnContextCreated() 
{ 
    this.Connection.ConnectionString = GenerateConnectionString(".\\SQLEXPRESS", "|DataDirectory|\\" + fileName + ".mdf"); 
} 

public static string GenerateConnectionString(string dbServer, string fileName) 
{ 
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); 

    // Set the properties for the data source. 
    sqlBuilder.DataSource = dbServer; 
    //sqlBuilder.InitialCatalog = dbName; 
    //sqlBuilder.UserID = "YOUR_USERNAME"; 
    //sqlBuilder.Password = "YOUR_PASSWORD"; 
    sqlBuilder.IntegratedSecurity = true; 
    sqlBuilder.AttachDBFilename = fileName; 
    sqlBuilder.UserInstance = true; 
    sqlBuilder.MultipleActiveResultSets = true; 
    sqlBuilder.ApplicationName = "EntityFramework"; 

    // Build the SqlConnection connection string. 
    string providerString = sqlBuilder.ToString(); 

    // Initialize the EntityConnectionStringBuilder. 
    EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 

    //Set the provider name. 
    entityBuilder.Provider = "System.Data.SqlClient"; 

    // Set the provider-specific connection string. 
    entityBuilder.ProviderConnectionString = providerString; 

    // Set the Metadata location. 
    entityBuilder.Metadata = @"res://*/Model.csdl| 
        res://*/Model.ssdl| 
        res://*/Model.msl"; 

    return entityBuilder.ToString(); 
} 

如果可能的話,我想堅持到視頻中所示的方法,使用Domain Services和ADO.NET實體模型,因爲我獲得的RIA Services功能讓我拖刪除表格,推送更改等等。

如何在運行時指向數據庫,同時仍然使用視頻中顯示的方法?

編輯

所有的SQL數據庫,我將指向具有相同的佈局。也就是說,他們有相同的表和字段。用戶特定的數據被填充到這些字段中。

回答

0

要做到這一點,你需要有一個單獨的數據層。

如果你正在關注MVVM,那麼在文件後面的視圖代碼中應該沒有數據訪問代碼。

Eitherway我建議你在你的解決方案中添加一個新的庫項目來實現你的數據層代碼。這個庫只公開那些獲取你的數據所需的方法,這些方法應該在公共接口類型中定義。您的所有業務邏輯都將引用此接口或實現它的類。其餘的數據層代碼如果需要在項目中公開,則應聲明爲內部代碼。

然後,您可以實現一個屬性,從而爲數據庫傳遞數據層連接字符串。

如果您需要使用不同類型的數據庫,例如SQL或Oracle,那麼您可以使用工廠模式來實例化實現該接口的類,但特定於該數據庫類型。

當以這種方式實現時,您訪問不同數據庫時不需要以任何方式更改業務邏輯。

MVVM模式往往是Silverlight/WPF應用程序的默認模式,但您會發現大多數教學示例都使用默認模式,即業務邏輯駐留在文件後面的代碼中。這是可以的,直到您開始嘗試對數據訪問代碼或業務邏輯進行重大更改時,您會發現自己的代碼變化比您需要的要多得多。

編輯

下面是一些鏈接,詳細MVVM和Silverlight。

http://msdn.microsoft.com/en-us/magazine/dd458800.aspx

http://www.codeproject.com/KB/silverlight/MVVMSilverlight.aspx

下面是一些鏈接,詳細數據層庫模式:

http://msdn.microsoft.com/en-us/library/ff649690.aspx

http://www.devx.com/dotnet/Article/33695/0/page/5

http://www.codeproject.com/KB/architecture/linqrepository.aspx

+0

你好ChrisBD。謝謝回覆。如上所述,我對Silverlight和Web編程一般都不熟悉。我在桌面應用程序中更流暢,比如控制檯應用程序和XNA。你說的很多東西,我不明白。 請您詳細說明如何才能實現MVVM模式?如果你能把我和一個能夠實現我的目標的樣本聯繫起來,或者將我指向可以學習的資源,那就太好了。 謝謝! – Dragonseer 2012-01-10 06:03:37

+0

爲您添加了一些可能有所幫助的鏈接。 – ChrisBD 2012-01-10 08:37:54

+0

謝謝你的幫助! – Dragonseer 2012-02-10 19:16:45