从Entity Framework连接字符串创建DataContext?

Ste*_*ven 6 c# asp.net entity-framework

我正在尝试在我的代码中进行此调用:

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

这是我的连接字符串:

<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>
Run Code Online (Sandbox Code Playgroud)

创建DataContext时出错:不支持关键字:'metadata'.

如果我使用第二个连接字符串,我在尝试获取表时出错:'/'应用程序中的服务器错误."MyApp.Entities.Employee"类型未映射为表格.

我在这做错了什么?

cas*_*One 9

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

当您使用LINQ到实体创建实体模型时,它会创建一个从中派生的对象,ObjectContext该对象具有IQueryable<T>您将用于查询基础的实现.这ObjectContext也将具有构造函数,这些构造函数采用适当的元数据将实体模型映射到数据库; 这就是Entity Framework连接字符串需要Metadata引用的原因.

当您尝试使用LINQ-to-SQL时,可以将常规数据库连接传递给DataContext类(或派生类).在DataContext处理您的对象数据库不同于实体框架的映射; 它依赖于模型上的属性来映射到表/列(分别使用TableAttributeColumnAttribute属性).使用实体框架创建实体时,这些属性不存在.

注意:您可以使用XML映射文件(与实体框架中使用的不同的类型)与LINQ-to-SQL,但它并不常用.

也就是说,最简单的方法是选择一个技术堆栈(LINQ-to-SQL或LINQ-to-Entities)并坚持下去.


Mic*_*ael 5

如果你想使用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类声明了一个基类.

改变了我的回答以反映他的评论


Jua*_*rto 5

以防万一,这就是我所做的.我在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();
Run Code Online (Sandbox Code Playgroud)