10bet网址
连接器和api手册
本手册下载
PDF (Ltr)- 5.2 mb
PDF (A4)- 5.2 mb


4.7.1实体框架6的支持

MySQL连接器/净集成支持实体框架6 (EF6),目前包括支持跨平台应用程序部署与EF 6.4版本。本章描述了如何配置和使用EF6特性实现连接器/净。

在本节中:

最低要求EF6只在Windows

  • 连接器/ NET 6.10或8.0.11

  • MySQL服务器5.6

  • 实体框架6集

  • net框架4.5.1 (。净框架4.5.2连接器/净8.0.22)

最低要求为EF 6.4跨平台支持

  • 连接器/净8.0.22

  • MySQL服务器5.6

  • 实体框架6.4总成

  • net 2.1(标准。网络核心SDK 3.1和Visual Studio 2019 16.5版)

配置

请注意

MySQL连接器/净8.0发行版系列有EF6总成和NuGet包的命名方案,不同于计划使用以前的发行版系列,如6.9和6.10。配置连接器/使用EF6净6.9或6.10,替代组装和包名在这一节中使用以下:

配置连接器/净EF6支持:

  1. 在编辑配置部分app.config文件添加连接字符串和连接器/净提供者。

    < connectionStrings > <添加名称= " MyContext " providerName = " MySql.Data。MySqlClient " connectionString = "服务器= localhost;端口= 3306;数据库= mycontext; uid =根;密码= * * * * * * * * " / > < / connectionStrings > < entityFramework > < defaultConnectionFactory type = " System.Data.Entity.Infrastructure。SqlConnectionFactory, EntityFramework " / > <供应商> <提供者invariantName = " MySql.Data。MySqlClient MySql.Data.MySqlClient“type =”。MySqlProviderServices MySql.Data。EntityFramework invariantName = " System.Data " / > <提供者。SqlClient System.Data.Entity.SqlServer“type =”。SqlProviderServices EntityFramework。"状态"置疑" / > < /供应商> < / entityFramework >
  2. 应用装配参考使用的技术:

    • NuGet包。安装这个引用会自动添加到NuGet包app.config. config文件在安装。例如,安装包连接器/净8.0.22,使用下列安装选项之一:

      • 命令行界面(CLI)

        dotnet MySql.Data添加包。EntityFramework - version 8.0.22
      • 包管理器控制台(PMC)

        安装包MySql.Data。EntityFramework - version 8.0.22
      • Visual Studio NuGet包管理器。对于这个选项,选择nuget.org作为包来源,搜索mysql.data,安装一个稳定的版本MySql.Data.EntityFramework

    • MySQL安装程序或MySQL连接器/净MSI文件。安装MySQL连接器/净,然后添加一个参考MySql.Data.EntityFramework组装到您的项目。根据使用的。net Framework版本,组装来自v4.0,v4.5开发,或v4.8文件夹中。

    • MySQL连接器/净源代码。从源代码构建连接器/净,然后插入以下数据供应商信息app.config. config文件:

      <系统。数据> < DbProviderFactories > <删除不变量= " MySql.Data。MySqlClient " / > <添加名称=不变= " MySql.Data“MySQL数据提供商”。= " MySqlClient”描述。净框架为MySQL数据提供商”type = " MySql.Data.MySqlClient。MySqlClientFactory, MySql。数据、Version = 8.0.22.0文化=中立,都必须c5687fc88969c44d " / > < / DbProviderFactories > < / system.data >
      重要的

      总是更新版本号匹配的MySql.Data.dll组装。

  3. 设置新的DbConfiguration类为MySQL。这一步是可选的,但强烈推荐,因为它增加了MySQL的所有依赖项解析器类。这可以通过三种方式:

    • 添加DbConfigurationTypeAttribute上下文类:

      [DbConfigurationType typeof (MySqlEFConfiguration)))
    • 调用DbConfiguration。SetConfiguration(新MySqlEFConfiguration ())在应用程序启动。

    • 设置DbConfiguration输入配置文件:

      < entityFramework codeConfigurationType = " MySql.Data.Entity。MySqlEFConfiguration, MySql.Data.EntityFramework " >

    也可以创建一个定制的DbConfiguration类并添加所需的依赖项解析器。

EF6特性

以下是连接器实现的新功能实体框架6 /网:

  • 跨平台的支持在连接器/净8.0.22实现EF 6.4作为初始提供者包括Linux和macOS版本兼容微软的。NET 2.1标准。

  • 异步查询并保存增加了支持基于任务的异步模式。net 4.5以来已经可用。连接器/网支持的新的异步方法有:

    • ExecuteNonQueryAsync

    • ExecuteScalarAsync

    • PrepareAsync

  • 连接弹性/重试逻辑支持自动恢复从瞬态连接失败。要使用该功能,增加了OnCreateModel方法:

    SetExecutionStrategy (MySqlProviderInvariantName。ProviderName,() = >新MySqlExecutionStrategy ());
  • 基于代码的配置给你代码中执行配置的选项,而不是执行一个配置文件,因为它已经完成传统上。

  • 依赖性解析介绍了支持服务定位器。一些部分的功能,可以使用自定义实现替换已经提出。添加一个依赖项解析器使用:

    AddDependencyResolver(新MySqlDependencyResolver ());

    以下解析器可以添加:

    • DbProviderFactory - > MySqlClientFactory

    • IDbConnectionFactory - > MySqlConnectionFactory

    • MigrationSqlGenerator - > MySqlMigrationSqlGenerator

    • DbProviderServices - > MySqlProviderServices

    • IProviderInvariantName - > MySqlProviderInvariantName

    • IDbProviderFactoryResolver - > MySqlProviderFactoryResolver

    • IManifestTokenResolver - > MySqlManifestTokenResolver

    • IDbModelCacheKey - > MySqlModelCacheKeyFactory

    • IDbExecutionStrategy - > MySqlExecutionStrategy

  • 拦截/ SQL记录提供了底层实体框架的构建块拦截操作使用简单的SQL记录之上:

    myContext.Database。日志=委托(字符串消息){Console.Write(消息);};
  • DbContext现在可以创建DbConnection已经打开了,使场景是很有帮助的,如果连接可以打开当创建上下文(如组件之间共享一个连接,当你不能保证连接的状态)

    [DbConfigurationType (typeof (MySqlEFConfiguration))]类JourneyContext: DbContext{公共DbSet < MyPlace > MyPlaces{得到;设置;}公共JourneyContext():基础(){}公共JourneyContext (DbConnection existingConnection, bool contextOwnsConnection):基础(existingConnection contextOwnsConnection){}}使用(MySqlConnection康涅狄格州= new MySqlConnection (“< connectionString >”)) {conn.Open ();…使用上下文(var = new JourneyContext(康涅狄格州、虚假)){…}}
  • 提高事务支持支持事务的外部框架以及改善的方法创建一个实体框架内事务。从实体框架6开始,Database.ExecuteSqlCommand ()将默认的命令在一个事务中如果一个人不是已经存在。有过载的方法,允许用户如果希望覆盖这一行为。执行存储过程通过api,如包括在模型中ObjectContext.ExecuteFunction ()做了同样的事情。也可以通过现有的事务上下文。

  • DbSet.AddRange / RemoveRange提供了一种优化的方式来添加或删除多个实体从一组。

代码首先特性

以下是新的代码首先特性支持的连接器/网:

  • 代码首先映射到插入/更新/删除存储过程支持:

    .MapToStoredProcedures modelBuilder.Entity < EntityType > () ();
  • 幂等迁移脚本允许您生成一个SQL脚本,可以在任何版本升级数据库最新版本。为此,运行- database就- script -SourceMigration: InitialDatabase美元在包管理器控制台命令。

  • 可配置的迁移历史表允许您定制迁移历史表的定义。

例子使用EF6

下面的c#代码示例6模型代表一个实体的结构框架。

使用MySql.Data.Entity;使用System.Data.Common;使用System.Data.Entity;名称空间EF6{/ /基于代码的配置和依赖分辨率(DbConfigurationType (typeof (MySqlEFConfiguration))]公共类停车:公共DbSet DbContext{{<汽车>汽车得到;设置;}公共停车场():基础(){}/ /构造函数使用的DbConnection已经开设了公共停车(DbConnection existingConnection, bool contextOwnsConnection):基础(existingConnection contextOwnsConnection){}保护覆盖空白OnModelCreating (DbModelBuilder modelBuilder) {base.OnModelCreating (modelBuilder);.MapToStoredProcedures modelBuilder.Entity <汽车> ()();}}公共类车{公共int CarId{得到;设置;{}公共字符串模型得到; set; } public int Year { get; set; } public string Manufacturer { get; set; } } }

接下来的c#代码示例展示了如何使用先前的实体模型的应用程序在MySQL表存储数据。

使用MySql.Data.MySqlClient;使用系统;使用System.Collections.Generic;名称空间EF6{{公共静态类示例空白ExecuteExample(){字符串connectionString =“服务器= localhost;端口= 3305;数据库=停车;uid =根”;使用(MySqlConnection连接= new MySqlConnection (connectionString)){/ /如果不存在创建数据库使用(停车contextDB =新的停车(连接,假)){contextDB.Database.CreateIfNotExists ();}connection.Open ();MySqlTransaction事务= connection.BeginTransaction ();试已经打开的{/ / DbConnection使用(停车上下文= new停车(连接,假)){/ /拦截/ SQL日志context.Database。日志=(字符串消息)= > {Console.WriteLine(消息);};/ /通过现有的事务上下文context.Database.UseTransaction(事务); // DbSet.AddRange List cars = new List(); cars.Add(new Car { Manufacturer = "Nissan", Model = "370Z", Year = 2012 }); cars.Add(new Car { Manufacturer = "Ford", Model = "Mustang", Year = 2013 }); cars.Add(new Car { Manufacturer = "Chevrolet", Model = "Camaro", Year = 2012 }); cars.Add(new Car { Manufacturer = "Dodge", Model = "Charger", Year = 2013 }); context.Cars.AddRange(cars); context.SaveChanges(); } transaction.Commit(); } catch { transaction.Rollback(); throw; } } } } }