在使用Visual Studio 2013添加ADO.NET實體數據模型新建鏈接時,默認是沒有Mysql選項的。此時咱們須要安裝兩個東西:html
一、mysql-for-visualstudio:Mysql的Visual Studio插件,推薦1.2.3版本mysql
二、mysql-connector-net:.net鏈接Mysql的程序,推薦6.8.3,版本。若是安裝高版本可能致使一系列問題。詳見:http://blog.csdn.net/niewq/article/details/41877301。sql
Install-Package EntityFramework -Version 6.0.0
Install-Package EntityFramework.zh-Hans -Version 6.0.0
Install-Package MySql.Data.Entity.EF6數據庫
每一個命令輸入以後按回車執行,你會發現前兩個都很順利,可是第三個卻報錯了:api
此時咱們不經過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>
而後,必定要從新生成項目!!!ide
接下來,就是從數據庫選擇表以生成EDMX文件,可是在此過程當中,你可能會遇到下列問題:ui
VS給出了一堆的提示,可是重點就是紅框內的:表「TableDetails」中列「IsPrimaryKey」的值爲 DBNull。這個問題的解決方案在這。咱們按照文中所說,設置數據庫testbak(我用的數據庫):
一、重啓數據庫服務器。
二、use testbak;
三、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。
DbContext是EntityFramework很重要的部分,鏈接域模型與數據庫的橋樑,是與數據庫通訊的主要類。
DbContext主要負責如下活動:
EntitySet::DbContext包含了全部映射到表的entities
Querying:將Linq-To-Entities轉譯爲Sql併發送到數據庫
Change Tracking:從數據庫獲取entities後保留並跟蹤實體數據變化
Persisting Data:根據entity狀態執行Insert、update、delete命令
Caching:DbContext的默認第一級緩存,在上下文中的生命週期中存儲entity
Manage Relationship:DbContext在DbFirst模式中使用CSDL、MSL、SSDL管理對象關係,Code first中使用fluent api 管理關係
Object Materialization:DbContext將物理錶轉成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
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); } }
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()) { //一、查詢要修改的對象集合 var list = db.Set<T>().Where<T>(whereLambda).ToList(); //二、獲取要修改的對象的類型 Type t = typeof(T); //三、循環要修改的實體對象,並根據要修改的屬性名修改對象對應的屬性值 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(); } } } }
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); } } }
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(); } } }
文章中須要使用的插件下載地址:mysql-for-visualstudio-1.2.3.zip、mysql-connector-net-6.8.3.zip。
具體的操做步驟並不必定按文中所述的來。