【问题标题】:Create DataContext from Entity Framework connection string?从实体框架连接字符串创建 DataContext?
【发布时间】:2011-05-16 02:15:47
【问题描述】:

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

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 时出现错误:不支持关键字:'元数据'。

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

我在这里做错了什么?

【问题讨论】:

    标签: c# asp.net entity-framework


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      如果你想使用实体框架,你应该使用 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 类的基类。

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

      【讨论】:

      • 1) VS.NET 不会生成从DataContext 派生的类; DataContext 由 LINQ-to-SQL 使用,而不是 LINQ-to-Entities。 VS.NET 生成派生自ObjectContext 的类。 2) 没有什么禁止直接使用ObjectContext。 VS.NET 生成的是在其之上的一个薄层,带有一些方便的方法;如果您愿意,您可以轻松地自己调用这些方法,并且您根本不必使用 VS.NET 生成的类,您只需给它一个包含元数据信息的连接字符串(或提供一个 @987654328 @单独)。
      • @casperOne 1) 感谢您的澄清。代表我,那真是太糟糕了。 (我很少看 Linq-To-Sql 和 EF 生成的类) 2)我认为虽然可以在 EF 的情况下直接使用基类,但我怀疑很多人会费心自己编写元数据文件。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        EntityModel中已经定义了connectionstring,所以可以尝试使用默认的connection,如下:

        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) 中的第二个连接字符串

        【讨论】:

        • 你有一个需要 0 个参数的 DataContext,但我没有。您的 DataContext 在哪个命名空间中?我的是 System.Data.Linq.DataContext。
        • 嗯.. 有趣。我的 DataContext 是在我创建 ADO.NET 实体数据模型时创建的。之后,我只使用实体容器名称的上下文。也许我的实现与您的不同,在这种情况下,我的回答对您没有太大帮助。
        • 您应该仍然可以将 dataContext 与字符串 MyDB 一起使用。connectionconn = ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString; DataContext context = new DataContext(conn);
        • 您确定您不是在使用 LINQ-to-SQL 工作吗? DataContext 类不是由 VS.NET 使用 EF 生成的; ObjectContext 类是。
        • @casperone:谢谢。我看到了DataContext,想到了ObjectContext。我应该已经掌握了技术的混合,会留意这一点。 +1
        猜你喜欢
        • 1970-01-01
        • 2011-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 2012-10-11
        • 2014-02-03
        相关资源
        最近更新 更多