2011-12-17 57 views
0

我已閱讀了相當多的帖子,但這看起來非常有用,但我不確定我瞭解如何實現此解決方案。我是否應該將這些代碼放在使用實體模型的每個類中?我已經閱讀了微軟的文檔,我想我對這個太新了。ASP.Net Linq to Entities:無法加載指定的元數據資源.- EntityConnectionStringBuilder

我的實體模型是在我的DATALAYER這是一個單獨的項目。我也有BUSINESSLOGIC和UI圖層。從我已經能夠收集到的信息來看,這聽起來像是這個問題與我的實體模型處於不同的項目中有關。是對的嗎?提前致謝!

從另一個帖子一種更好的方式來構建連接字符串是EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName) 
{ 
    var csBuilder = new EntityConnectionStringBuilder(); 

    csBuilder.Provider = "System.Data.SqlServerCe.3.5"; 
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName); 

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
     typeof(YourObjectContextType).Assembly.FullName); 

    return csBuilder.ToString(); 
} 

public static string GetSqlConnectionString(string serverName, string databaseName) 
{ 
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder(); 

    providerCs.DataSource = serverName; 
    providerCs.InitialCatalog = databaseName; 
    providerCs.IntegratedSecurity = true; 

    var csBuilder = new EntityConnectionStringBuilder(); 

    csBuilder.Provider = "System.Data.SqlClient"; 
    csBuilder.ProviderConnectionString = providerCs.ToString(); 

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
     typeof(YourObjectContextType).Assembly.FullName); 

    return csBuilder.ToString(); 
} 

回答

0

你能移動連接的詳細信息到您的配置文件?這裏有一篇關於connection strings的文章。並按照同樣的例子在文章中,這裏是上下文的初始化和使用:

using (EntityConnection connection = EntityConnection("name=AdventureWorksEntities")) 
{ 
    AdventureWorksEntities context = new AdventureWorksEntities(connection); 
    context.AddObject("Customer", customer); 
    context.SaveChanges(); 
} 

編輯:有沒有必要重複連接建築規範在給客戶打電話。你應該遠離呼叫者隱藏這些細節。下面是返回新對象上下文的工廠示例:

//app.config 
<connectionStrings> 
    <add name="TestEntities" connectionString="...." /> 
</connectionStrings> 

//data entities 
public partial class TestEntities : ObjectContext 
{ 
    public TestEntities() : base("name=TestEntities", "TestEntities") 
    { 
     ... 
    } 
    .... 
} 

//factory in Data Access layer 
public sealed class TestEntitiesFactory 
{ 
    public static Func<TestEntities> GetNewTestEntitiesInstance { get; set; } 

    static TestEntitiesFactory() 
    { 
     GetNewTestEntitiesInstance = TestEntitiesCreator.CreateTestEntities; 
    } 
} 

public sealed class TestEntitiesDefaultCreator 
{ 
    public static TestEntities CreateTestEntities() 
    { 
     TestEntities test = new TestEntities(); 

     //whatever initializations you need 

     return test; 
    } 
} 

//business layer 
using (TestEntities ctx = TestEntitiesFactory.GetNewTestEntitiesInstance()) 
{ 

} 
+0

感謝您的評論。我上面粘貼的代碼是您發佈之前的部分。在我看來,我需要在插入USING函數之前的所有前面的代碼。我的困惑就是所有這些。我是否需要把這個放在每個調用實體的類中? – Susan 2011-12-18 15:22:59

+0

我添加了一個示例,您如何將訪問權限公開給您的實體。 – tenorsax 2011-12-18 19:40:58

+0

@蘇珊,當然你不必使用工廠和創作者。你可以簡單地使用:using(TestEntities contex = new TestEntities()){};如您所見,默認構造函數使用app.config文件中指定的連接字符串名稱。 – tenorsax 2011-12-19 04:12:38