Mysql通過CodeFirst方式使用EF


1MySql環境准備

(1)ADO.NET driver

安裝ADO.NET操作MySql的驅動“Connector/NET”,下載地址如下:

https://dev.mysql.com/downloads/connector/net/8.0.html

(2)VS訪問MySql對象的支持(包括Entity Framework

A、通過安裝“MySQL for Visual Studio”以支持訪問MySql對象及VS的設計器

https://dev.mysql.com/downloads/windows/visualstudio/

B、通過NuGet安裝“MySql.Data.Entity.EF6”以支持訪問MySql對象

 

2、配置

(1)EntityFramework

通過NuGet安裝EntityFramework,安裝完后會自動在config里添加如下的section

<configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>

驅動(默認為MSSql驅動,及指向的本地DB的實例MSSQLLocalDB-VS自帶的簡單的DB):

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
  </entityFramework>

(2)MySql.Data.MySqlClient驅動

通過“1.2”的方式安裝后,需確保項目引用到了如下兩個組件

 

否則在程序集里添加

 

在config里會自動添加或需手動指定EF的適配器

<entityFramework>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
</entityFramework>

(3)connectionString

通過connectionString配置的連接串的優先級大於defaultConnectionFactory

<connectionStrings>
    <!--Mysql:MultipleActiveResultSets,App=EntityFramework不支持-->
    <add name="ModelCaiji" connectionString="data source=localhost;initial catalog=XXX;user id=XXX;password=XXX;integrated security=True;" providerName="MySql.Data.MySqlClient"/>
</connectionStrings>

(4)注意

A、無法為具有固定名稱“MySql.Data.MySqlClient”的 ADO.NET 提供程序加載在應用程序配置文件中注冊的實體框架提供程序類。

需要確保對DLL以應用,及版本后的正確。

https://blog.csdn.net/QQ459932400/article/details/58068551

B、利用VS自帶的命令行工具查看PublicKeyToken

SN –T “XXXXXXXXXXXXXX.dll”

https://blog.csdn.net/kuui_chiu/article/details/6914049

 

3、實現

(1)DB上下文類

通過添加空的Code First模型或者手工添加類繼承DbContext

 

配置好對應的connectionString后即可通過EF訪問DB

using (ModelCaiji context=new ModelCaiji())
            {
               var query= context.Database.SqlQuery<string>("select Name from filminfo;");
                return query.ToList();
            }

(2)實體及與table的映射

添加實體及與table的映射以便支持相應實體的操作及生成DB

    /// <summary>
    /// 實體
    /// </summary>
    public class FilminfoEntity
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    /// <summary>
    /// 實體與數據表的映射(Fluent API)
    /// </summary>
    public class FilminfoEntityMap : EntityTypeConfiguration<FilminfoEntity>
    {
        public FilminfoEntityMap()
        {
            #region Generated
            //ToTable("filminfo");

            HasKey(table => table.Id);

            Property(table => table.Id)
                .HasColumnName("Id")
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
                .IsRequired();
            Property(table => table.Name)
                .HasColumnName("Name");
            #endregion Generated
        }
    }

(3)DB初始化策略

EF上下文支持如下初始化DB的策略

        public ModelCaiji()
            : base("name=ModelCaiji")
        {
            //數據庫初始化策略
            //Database.SetInitializer<ModelCaiji>(new CreateDatabaseIfNotExists<ModelCaiji>());//(默認策略)如果數據庫不存在,那么就創建數據庫。
            //Database.SetInitializer<ModelCaiji>(new DropCreateDatabaseIfModelChanges<ModelCaiji>());//如果模型變化了,數據庫就會被重新創建,原來的數據庫被刪除掉了。
            //Database.SetInitializer<ModelCaiji>(new DropCreateDatabaseAlways<ModelCaiji>());//每次運行程序都會重新創建數據庫,這在開發和調試的時候非常有用。
            Database.SetInitializer<ModelCaiji>(null);//關閉策略,不自動創建DB
            //Database.SetInitializer<ModelCaiji>(new CustomDatabaseInitializer<ModelCaiji>());//自定義策略
        }

自定義策略:

    /// <summary>
    /// 自定義數據庫初始化策略
    /// </summary>
    public class CustomDatabaseInitializer<TModelCaiji> : DropCreateDatabaseAlways<TModelCaiji> where TModelCaiji : ModelCaiji
    {
        protected override void Seed(TModelCaiji context)
        {
            //添加電影數據
            FilminfoEntity filminfoEntity = new FilminfoEntity()
            {
                Name = "斗破蒼穹"
            };

            context.FilminfoEntity.Add(filminfoEntity);
            base.Seed(context);

        }

    }

(4)約定

可移除EF自帶的約定

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            //添加實體與數據表的映射
            modelBuilder.Configurations.Add(new FilminfoEntityMap());

            //移除約定
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//(移除此約定將不會改變DbSet對應的表名)如果在Map里沒有明確指定表名,將使用DbSet實體集的名稱當作表名並且會強制轉會為復數格式
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();//移除級聯刪除
            modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
            
        }

 

4、其它

(1) DbContext實例初始化問題

A、對於一般的BS系統為了提高與DB交互的性能需確保數據庫上下文DbContext對象在同一操作線程內唯一

                //CallContext:是線程內部唯一的獨用的數據槽(一塊內存空間)
                //傳遞DbContext進去獲取實例的信息,在這里進行強制轉換。
                AppDbContext dbContext = CallContext.GetData("DbContext") as AppDbContext;
                if (dbContext == null) //線程在數據槽里面沒有此上下文
                {
                    lock (_lockObj)
                    {
                        if (dbContext == null)
                        {
                            dbContext = new AppDbContext(); //如果不存在上下文的話,創建一個EF上下文
                            //我們在創建一個,放到數據槽中去
                            CallContext.SetData("DbContext", dbContext);
                        }
                    }
                }
                return dbContext;

B、對於類似多線程的環境需避免數據庫上下文DbContext對象重復使用

https://blog.csdn.net/u011127019/article/details/54576703

 

5、參考

Entity Framework 6官方文檔

https://docs.microsoft.com/zh-cn/ef/ef6/index

Entity Framework 5.0 Code First全面學習

https://blog.csdn.net/gentle_wolf/article/details/14004345

EF三種編程方式的區別Database first ,Model first ,code first

https://www.cnblogs.com/gaodaoheng/articles/6489918.html

EF 配置(SqlServer,Mysql)

https://www.cnblogs.com/NatureSex/p/3408021.html

EF Code First:實體映射,數據遷移,重構

http://developer.51cto.com/art/201309/409947_all.htm

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM