从实体框架连接字符串创建数据上下文

本文关键字:创建 数据 上下文 字符串 连接 实体 框架 | 更新日期: 2023-09-27 17:56:26

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

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>

我在创建数据上下文时收到错误:不支持关键字:"元数据"。

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

我在这里做错了什么?

从实体框架连接字符串创建数据上下文

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

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

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

注意: 可以将 XML 映射文件(与实体框架中使用的排序不同)与 LINQ-to-SQL 一起使用,但它并不常用。

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

如果要使用实体框架,则应使用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类的基类一样。

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

以防万一,这就是我所做的。我在 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();

连接字符串已在实体模型中定义,因此您可以尝试使用默认连接,如下所示:

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

您还可以尝试以下操作:

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

编辑:GetTable()将返回T类型,因此上面的语法是正确的。

如果要重写连接字符串,请使用 web.config 文件 (MyDB) 中的第二个连接字符串