簡體   English   中英

從Entity Framework連接字符串創建DataContext?

[英]Create DataContext from Entity Framework connection string?

我正在嘗試在我的代碼中進行此調用:

string conn = ConfigurationManager.ConnectionStrings["MyDBEntities"].ConnectionString;
DataContext context = new DataContext(conn);
Table<MyApp.Entities.Employee> myTable = context.GetTable<MyApp.Entities.Employee>();

這是我的連接字符串:

<connectionStrings>
  <add name="MyDBEntities" connectionString="metadata=res://*/Entities.MyDB.csdl|res://*/Entities.MyDB.ssdl|res://*/Entities.MyDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=STEVEN-PC;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  <add name="MyDB" connectionString="Server=STEVEN-PC;Database=MyDB;Trusted_Connection=yes;" />
</connectionStrings>

創建DataContext時出錯: 不支持關鍵字:'metadata'。

如果我使用第二個連接字符串,我在嘗試獲取表時出錯'/'應用程序中的服務器錯誤。 “MyApp.Entities.Employee”類型未映射為表格。

我在這做錯了什么?

您正在混合和匹配LINQ-to-SQLLINQ-to-Entites ; 兩者不兼容。

當您使用LINQ-to-Entities創建實體模型時,它會創建一個派生自ObjectContext的對象,該對象將具有您將用於查詢基礎的IQueryable<T>實現。 ObjectContext還將具有構造函數,這些構造函數采用適當的元數據將實體模型映射到數據庫; 這就是Entity Framework連接字符串需要Metadata引用的原因。

當您嘗試使用LINQ-to-SQL時,可以將常規數據庫連接傳遞給DataContext類(或派生類)。 DataContext以不同於Entity Framework的方式處理對象到數據庫的映射; 它依賴於模型上的屬性來映射到表/列(分別使用TableAttributeColumnAttribute屬性)。 使用實體框架創建實體時,這些屬性不存在。

注意:您可以使用XML映射文件(與實體框架中使用的不同的類型)與LINQ-to-SQL,但它並不常用。

也就是說,最簡單的方法是選擇一個技術堆棧(LINQ-to-SQL或LINQ-to-Entities)並堅持下去。

以防萬一,這就是我所做的。 我在Web.config中沒有連接,因為我需要一個DropDownList來選擇連接。

string connDev = @"metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string=""Server=MyDevServer;Database=MyDB;Integrated Security=True""";

EntityConnection ec = new EntityConnection(connDev);

MyDBContext db = new MyDBContext(ec);

var people = db.People.ToList();

如果你想使用Entity Framework,你應該使用ObjectContext,而不是DataContext,因為這是Linq-To-Sql的基類。

當您創建ADO.NET實體數據模型時,Visual Studio生成(在您從數據庫向導完成生成模型或使用設計器之后),從ObjectContext派生的類,該類具有默認連接字符串(您在向導中選擇) 。 在這里,您可以看到ADO.NET團隊的一個很好的教程如何開始使用EF。

你不應該直接使用ObjectContext,至少不是沒有手動創建元數據文件並在你的連接字符串中指向它們(從未見過直接使用的DataContext類,所以如果我錯了有人糾正我),作為向導我上面提到的創建各種映射數據 - 將SQL表/視圖/其他東西映射到實體類。

如果要提供自己的類連接,可以使用EntityConnectionStringBuilder以編程方式進行。

是一個如何從MSDN使用EntityConnectionStringBuilder的示例

編輯:我錯誤地寫了關於DataContext,好像它是設計器生成的代碼的EF基類。 就像casperOne為Linq-To-Sql類聲明了一個基類。

改變了我的回答以反映他的評論

connectionstring已在EntityModel中定義,因此您可以嘗試使用默認連接,如下所示:

using (context = new DataContext())
{
    var myTable = context.GetTable<MyApp.Entities.Employee>();
}

您還可以嘗試以下方法:

MyApp.Entities.Employee myTable = context.GetTable<MyApp.Entities.Employee>();

編輯: GetTable <T>()將返回類型T,因此上面的語法是正確的。

如果要覆蓋連接字符串,請使用web.config文件(MyDB)中的第二個連接字符串

暫無
暫無

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

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