我正在尝试在我的代码中进行此调用:
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="Data Source=STEVEN-PC;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
<add name="MyDB" connectionString="Server=STEVEN-PC;Database=MyDB;Trusted_Connection=yes;" />
</connectionStrings>
创建DataContext时出错:不支持关键字:'元数据'。
如果我使用第二个连接字符串,则在尝试获取表时出现错误:>应用程序中的服务器错误。 “MyApp.Entities.Employee”类型未映射为表格。
我在这里做错了什么?
答案 0 :(得分:9)
您正在混合并匹配LINQ-to-SQL和LINQ-to-Entites;两者不兼容。
当您使用LINQ-to-Entities创建实体模型时,它会创建一个派生自ObjectContext
的对象,该对象具有您将用于查询基础的IQueryable<T>
实现。此ObjectContext
也将具有构造函数,这些构造函数采用适当的元数据将实体模型映射到数据库;这就是实体框架连接字符串需要Metadata
引用的原因。
当您尝试使用LINQ-to-SQL时,可以将常规数据库连接传递给DataContext
类(或派生类)。 DataContext
以与实体框架不同的方式处理对象到数据库的映射;它依赖于模型上的属性来映射到表/列(分别使用TableAttribute
和ColumnAttribute
属性)。使用实体框架创建实体时,这些属性不存在。
注意:您可以使用XML映射文件(与实体框架中使用的不同,使用LINQ-to-SQL),但它并不常用。
尽管如此,最简单的方法是选择一个技术堆栈(LINQ-to-SQL或LINQ-to-Entities)并坚持使用。
答案 1 :(得分:5)
如果你想使用Entity Framework,你应该使用ObjectContext,而不是DataContext,因为这是Linq-To-Sql的基类。
当您创建ADO.NET实体数据模型时,Visual Studio会生成(在您从数据库向导完成生成模型或使用设计器之后),从ObjectContext派生的类,该类具有默认连接字符串(您在魔法师)。 Here你可以从ADO.NET团队看到一个很好的教程如何开始使用EF。
你不应该直接使用ObjectContext,至少不是没有手动创建元数据文件并在连接字符串中指向它们(从未见过直接使用的DataContext类,所以如果我错了,有人纠正我),我上面提到的向导创建了各种映射数据 - 将SQL表/视图/其他东西映射到实体类。
如果您想提供自己与班级的连接,可以使用EntityConnectionStringBuilder以编程方式进行。
This是如何从MSDN使用EntityConnectionStringBuilder的示例
编辑:我错误地写了关于DataContext的内容,好像它是设计器生成代码的EF基类一样。正如 casperOne 为Linq-To-Sql类声明了一个基类。
更改了我的回答以反映他的评论
答案 2 :(得分: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();
答案 3 :(得分:1)
connectionsity已在EntityModel中定义,因此您可以尝试使用默认连接,如下所示:
using (context = new DataContext())
{
var myTable = context.GetTable<MyApp.Entities.Employee>();
}
您还可以尝试以下操作:
MyApp.Entities.Employee myTable = context.GetTable<MyApp.Entities.Employee>();
编辑: GetTable&lt; T&gt;()将返回T类型,因此上面的语法是正确的。
如果要覆盖连接字符串,请使用web.config文件(MyDB)中的第二个连接字符串