使用VS2013 + EF6 + .NET4.5 連接Mysql數據庫


1、安裝插件

    在使用Visual Studio 2013添加ADO.NET實體數據模型新建連接時,默認是沒有Mysql選項的。此時我們需要安裝兩個東西:

    1、mysql-for-visualstudio:Mysql的Visual Studio插件,推薦1.2.3版本

    2、mysql-connector-net:.net連接Mysql的程序,推薦6.8.3,版本。如果安裝高版本可能導致一系列問題。詳見:http://blog.csdn.net/niewq/article/details/41877301

2、新建ADO.NET實體數據模型

  2、1、按圖操作,添加實體數據模型:

 

  

  

  

  

 

 2.2、一切進展貌似都很順利。接下來你可能會看到Visual Studio給出了如下的提示:

 

 2.3、解決方法:在NuGet的控制台輸入以下命令:

     Install-Package EntityFramework -Version 6.0.0
     Install-Package EntityFramework.zh-Hans -Version 6.0.0
     Install-Package MySql.Data.Entity.EF6

     每個命令輸入之后按回車執行,你會發現前兩個都很順利,但是第三個卻報錯了:

    

    此時我們不通過NuGet添加這個引用,具體步驟為將MySQL Connector Net 6.8.3\Assemblies\v4.5(視你的項目使用的.net版本而定,我的是.net 4.5)下的所有dll文件引用進來。我的機器上安裝目錄如下:

   

    全部引用

   

     然后在應用程序配置文件中添加:<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"></provider>

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <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>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"></provider>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

  然后,一定要重新生成項目!!!

  2.4、繼續下面的步驟,成功。

  

3、Mysql數據庫改動

   接下來,就是從數據庫選擇表以生成EDMX文件,但是在此過程中,你可能會遇到下列問題:

  

   VS給出了一堆的提示,但是重點就是紅框內的:表“TableDetails”中列“IsPrimaryKey”的值為 DBNull。這個問題的解決方案在。我們按照文中所說,設置數據庫testbak(我用的數據庫):

   1、重啟數據庫服務器。

   2、use testbak;

   3、set global optimizer_switch='derived_merge=OFF';

  

   再去嘗試一次,成功!!!

  

   解決方案窗口多了很多文件:

  

  每個實體數據模型生成一個context類,數據庫每個表生成一個entity類。在Model1.edmx中包含的兩個重要的文件Model1.Context.tt和Model1.tt。第一個是用於生成Context類的T4模板,第二是用於生成表映射實體類(POCO類,POCO:Plain Old CLR Object)的T4模板。

  Model1.Context.cs是從System.Data.Entity.DbContext類繼承。EF4.1中則是從ObjectContext類繼承。DbContext類與ObjectContext類似,它對ObjcetContext類進行包裝更利於開發的三種模式:CodeFirst、Model First、Database First。

4、DbContext

  DbContext是EntityFramework很重要的部分,連接域模型與數據庫的橋梁,是與數據庫通信的主要類。

 

  

DbContext主要負責以下活動:

EntitySet:DbContext包含了所有映射到表的entities

Querying將Linq-To-Entities轉譯為Sql並發送到數據庫

Change Tracking從數據庫獲取entities后保留並跟蹤實體數據變化

Persisting Data根據entity狀態執行Insert、update、delete命令

CachingDbContext的默認第一級緩存,在上下文中的生命周期中存儲entity

Manage RelationshipDbContext在DbFirst模式中使用CSDL、MSL、SSDL管理對象關系,Code first中使用fluent api 管理關系

Object MaterializationDbContext將物理表轉成entity實例對象

//DbContext實例化:
using (var ctx = newSchoolDBEntities())
{
//Can perform CRUD operation using ctx here..
}

//將DbContext轉為ObjectContext
using (var ctx = newSchoolDBEntities())
{
var objectContext = (ctx as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext;
//use objectContext here..
}

    詳見:http://www.cnblogs.com/xuf22/articles/5513283.html

5、增刪改查操作

   5.1 IDAL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace ADO.NETEFDemo
{
    public interface IDAL<T> where T : class,new()
    {
        /// <summary>
        ////// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        int Add(T model);

        /// <summary>
        ////// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        int Delete(Expression<Func<T, bool>> whereLambda);

        /// <summary>
        ////// </summary>
        /// <param name="whereLambda"></param>
        /// <param name="propertyNames"></param>
        /// <param name="perpertyValues"></param>
        /// <returns></returns>
        int Update(Expression<Func<T, bool>> whereLambda, string[] propertyNames, object[] perpertyValues);

        /// <summary>
        ////// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        List<T> GetModelList(Expression<Func<T, bool>> whereLambda);
    }
}

   5.2 DAL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ADO.NETEFDemo
{
    public class DAL<T> : IDAL<T> where T : class,new()
    {
        /// <summary>
        ////// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public int Add(T model)
        {
            using (testbakEntities db = new testbakEntities())
            {
                db.Set<T>().Add(model);
                return db.SaveChanges();
            }
        }

        /// <summary>
        ////// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public int Delete(Expression<Func<T, bool>> whereLambda)
        {
            using (testbakEntities db = new testbakEntities())
            {
                var dbQuery = db.Set<T>();

                //先查詢 對應表的 集合
                var list = dbQuery.Where(whereLambda).ToList();

                //遍歷集合 里要刪除的元素
                foreach (var item in list)
                {
                    //標記為 刪除狀態
                    dbQuery.Remove(item);
                }
                return db.SaveChanges();
            }
        }

        /// <summary>
        ////// </summary>
        /// <param name="whereLambda"></param>
        /// <param name="propertyNames"></param>
        /// <param name="perpertyValues"></param>
        /// <returns></returns>
        public int Update(Expression<Func<T, bool>> whereLambda, string[] propertyNames, object[] perpertyValues)
        {
            using (testbakEntities db = new testbakEntities())
            {
                //1、查詢要修改的對象集合
                var list = db.Set<T>().Where<T>(whereLambda).ToList();

                //2、獲取要修改的對象的類型
                Type t = typeof(T);

                //3、循環要修改的實體對象,並根據要修改的屬性名修改對象對應的屬性值
                foreach (var item in list)
                {
                    //循環 要修改的屬性 名稱, 並 反射取出 t 中的 屬性對象
                    for (int index = 0; index < propertyNames.Length; index++)
                    {
                        //獲取要修改的屬性名
                        string pName = propertyNames[index];

                        //獲取屬性對象
                        PropertyInfo pi = t.GetProperty(pName);

                        //調用屬性對象的 SetValue方法 為當前循環的 item對象 對應的屬性賦值
                        pi.SetValue(item, perpertyValues[index], null);
                    }
                }
                return db.SaveChanges();
            }
        }

        /// <summary>
        ////// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public List<T> GetModelList(Expression<Func<T, bool>> whereLambda)
        {
            using (testbakEntities db = new testbakEntities())
            {
                return db.Set<T>().Where(whereLambda).ToList();
            }
        }
    }
}

   5.3 BLL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace ADO.NETEFDemo
{
    public static class BLL<T> where T : class,new()
    {
        private static IDAL<T> dal = new DAL<T>();

        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="model"></param>
        public static int Add(T model)
        {
            return dal.Add(model);
        }

        /// <summary>
        /// 刪除
        /// </summary>
        /// <param name="whereLambda"></param>
        public static int Delete(Expression<Func<T, bool>> whereLambda)
        {
            return dal.Delete(whereLambda);
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <param name="propertyNames"></param>
        /// <param name="perpertyValues"></param>
        /// <returns></returns>
        public static int Update(Expression<Func<T, bool>> whereLambda, string[] propertyNames, object[] perpertyValues)
        {
            return dal.Update(whereLambda, propertyNames, perpertyValues);
        }

        /// <summary>
        /// 查詢
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public static List<T> GetModelList(Expression<Func<T, bool>> whereLambda)
        {
            return dal.GetModelList(whereLambda);
        }
    }
}

   5.4 調用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ADO.NETEFDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            GetArticleList();

            AddArticle();

            GetArticleList();

            UpdateArticle();

            GetArticleList();

            DeleteArticel();

            GetArticleList();

            Console.ReadKey();
        }

        /// <summary>
        /// 更新
        /// </summary>
        private static void UpdateArticle()
        {
            int result = BLL<t_crobot_reship_articles>
                .Update(e => e.title.Contains("EF"), new[] { "title", "update_time" }, 
                        new object[] { "我是使用EF修改過標題的文章", DateTime.Now });
            if (result >= 0)
            {
                Console.WriteLine("更新成功");
            }
            else
            {
                Console.WriteLine("更新失敗");
            }
            Console.WriteLine();
        }

        /// <summary>
        /// 刪除
        /// </summary>
        private static void DeleteArticel()
        {
            int result = BLL<t_crobot_reship_articles>.Delete(e => e.title.Contains("EF"));
            if (result >= 0)
            {
                Console.WriteLine("刪除成功");
            }
            else
            {
                Console.WriteLine("刪除失敗");
            }
            Console.WriteLine();
        }

        /// <summary>
        /// 新增
        /// </summary>
        private static void AddArticle()
        {
            t_crobot_reship_articles model = new t_crobot_reship_articles();
            model.create_time = DateTime.Now;
            model.module_id = 1;
            model.adword_id = 20;
            model.pick_id = 1;
            model.vote_id = "1";
            model.title = "我是使用EF添加的文章";
            model.content_id = 1;
            model.release_url = "http://www.sss.com";
            model.state = true;
            int result = BLL<t_crobot_reship_articles>.Add(model);
            if (result >= 0)
            {
                Console.WriteLine("新增成功");
            }
            else
            {
                Console.WriteLine("新增失敗");
            }
            Console.WriteLine();
        }

        /// <summary>
        /// 獲取文章列表
        /// </summary>
        private static void GetArticleList()
        {
            List<t_crobot_reship_articles> articleList = BLL<t_crobot_reship_articles>
                .GetModelList(e => e.state == true);

            Console.WriteLine("文章總數:" + articleList.Count.ToString());
            foreach (t_crobot_reship_articles model in articleList)
            {
                Console.WriteLine("標題:" + model.title);
            }

            Console.WriteLine();
        }
    }
}

   5.5 結果

6、小結

   文章中需要使用的插件下載地址:mysql-for-visualstudio-1.2.3.zipmysql-connector-net-6.8.3.zip

   具體的操作步驟並不一定按文中所述的來。


免責聲明!

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



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