连接mysql数据库2013_使用VS2013 + EF6 + .NET4.5 连接Mysql数据库
1、安裝插件
在使用Visual Studio 2013添加ADO.NET實體數(shù)據(jù)模型新建連接時,默認(rèn)是沒有Mysql選項的。此時我們需要安裝兩個東西:
1、mysql-for-visualstudio:Mysql的Visual Studio插件,推薦1.2.3版本
2、mysql-connector-net:.net連接Mysql的程序,推薦6.8.3,版本。如果安裝高版本可能導(dǎo)致一系列問題。詳見:http://blog.csdn.net/niewq/article/details/41877301。
2、新建ADO.NET實體數(shù)據(jù)模型
2、1、按圖操作,添加實體數(shù)據(jù)模型:
2.2、一切進(jìn)展貌似都很順利。接下來你可能會看到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
每個命令輸入之后按回車執(zhí)行,你會發(fā)現(xiàn)前兩個都很順利,但是第三個卻報錯了:
此時我們不通過NuGet添加這個引用,具體步驟為將MySQL Connector Net 6.8.3\Assemblies\v4.5(視你的項目使用的.net版本而定,我的是.net 4.5)下的所有dll文件引用進(jìn)來。我的機(jī)器上安裝目錄如下:
全部引用
然后在應(yīng)用程序配置文件中添加:
然后,一定要重新生成項目!!!
2.4、繼續(xù)下面的步驟,成功。
3、Mysql數(shù)據(jù)庫改動
接下來,就是從數(shù)據(jù)庫選擇表以生成EDMX文件,但是在此過程中,你可能會遇到下列問題:
VS給出了一堆的提示,但是重點就是紅框內(nèi)的:表“TableDetails”中列“IsPrimaryKey”的值為 DBNull。這個問題的解決方案在這。我們按照文中所說,設(shè)置數(shù)據(jù)庫testbak(我用的數(shù)據(jù)庫):
1、重啟數(shù)據(jù)庫服務(wù)器。
2、use testbak;
3、set global optimizer_switch='derived_merge=OFF';
再去嘗試一次,成功!!!
解決方案窗口多了很多文件:
每個實體數(shù)據(jù)模型生成一個context類,數(shù)據(jù)庫每個表生成一個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類進(jìn)行包裝更利于開發(fā)的三種模式:CodeFirst、Model First、Database First。
4、DbContext
DbContext是EntityFramework很重要的部分,連接域模型與數(shù)據(jù)庫的橋梁,是與數(shù)據(jù)庫通信的主要類。
DbContext主要負(fù)責(zé)以下活動:
EntitySet::DbContext包含了所有映射到表的entities
Querying:將Linq-To-Entities轉(zhuǎn)譯為Sql并發(fā)送到數(shù)據(jù)庫
Change Tracking:從數(shù)據(jù)庫獲取entities后保留并跟蹤實體數(shù)據(jù)變化
Persisting Data:根據(jù)entity狀態(tài)執(zhí)行Insert、update、delete命令
Caching:DbContext的默認(rèn)第一級緩存,在上下文中的生命周期中存儲entity
Manage Relationship:DbContext在DbFirst模式中使用CSDL、MSL、SSDL管理對象關(guān)系,Code first中使用fluent?api 管理關(guān)系
Object Materialization:DbContext將物理表轉(zhuǎn)成entity實例對象
//DbContext實例化:
using (var ctx =newSchoolDBEntities())
{//Can perform CRUD operation using ctx here..
}//將DbContext轉(zhuǎn)為ObjectContext
using (var ctx =newSchoolDBEntities())
{var objectContext = (ctx asSystem.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext;//use objectContext here..
}
5、增刪改查操作
5.1 IDAL
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Linq.Expressions;usingSystem.Text;usingSystem.Threading.Tasks;namespaceADO.NETEFDemo
{public interface IDAL where T : class,new()
{///
///增///
///
///
intAdd(T model);///
///刪///
///
///
int Delete(Expression>whereLambda);///
///改///
///
///
///
///
int Update(Expression> whereLambda, string[] propertyNames, object[] perpertyValues);///
///查///
///
///
List GetModelList(Expression>whereLambda);
}
}
5.2 DAL
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Linq.Expressions;usingSystem.Reflection;usingSystem.Text;usingSystem.Threading.Tasks;namespaceADO.NETEFDemo
{public class DAL : IDAL where T : class,new()
{///
///增///
///
///
public intAdd(T model)
{using (testbakEntities db = newtestbakEntities())
{
db.Set().Add(model);returndb.SaveChanges();
}
}///
///刪///
///
///
public int Delete(Expression>whereLambda)
{using (testbakEntities db = newtestbakEntities())
{var dbQuery = db.Set();//先查詢 對應(yīng)表的 集合
var list =dbQuery.Where(whereLambda).ToList();//遍歷集合 里要刪除的元素
foreach (var item inlist)
{//標(biāo)記為 刪除狀態(tài)
dbQuery.Remove(item);
}returndb.SaveChanges();
}
}///
///改///
///
///
///
///
public int Update(Expression> whereLambda, string[] propertyNames, object[] perpertyValues)
{using (testbakEntities db = newtestbakEntities())
{//1、查詢要修改的對象集合
var list = db.Set().Where(whereLambda).ToList();//2、獲取要修改的對象的類型
Type t = typeof(T);//3、循環(huán)要修改的實體對象,并根據(jù)要修改的屬性名修改對象對應(yīng)的屬性值
foreach (var item inlist)
{//循環(huán) 要修改的屬性 名稱, 并 反射取出 t 中的 屬性對象
for (int index = 0; index < propertyNames.Length; index++)
{//獲取要修改的屬性名
string pName =propertyNames[index];//獲取屬性對象
PropertyInfo pi =t.GetProperty(pName);//調(diào)用屬性對象的 SetValue方法 為當(dāng)前循環(huán)的 item對象 對應(yīng)的屬性賦值
pi.SetValue(item, perpertyValues[index], null);
}
}returndb.SaveChanges();
}
}///
///查///
///
///
public List GetModelList(Expression>whereLambda)
{using (testbakEntities db = newtestbakEntities())
{return db.Set().Where(whereLambda).ToList();
}
}
}
}
5.3 BLL
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Linq.Expressions;usingSystem.Text;usingSystem.Threading.Tasks;namespaceADO.NETEFDemo
{public static class BLL where T : class,new()
{private static IDAL dal = new DAL();///
///新增///
///
public static intAdd(T model)
{returndal.Add(model);
}///
///刪除///
///
public static int Delete(Expression>whereLambda)
{returndal.Delete(whereLambda);
}///
///修改///
///
///
///
///
public static int Update(Expression> whereLambda, string[] propertyNames, object[] perpertyValues)
{returndal.Update(whereLambda, propertyNames, perpertyValues);
}///
///查詢///
///
///
public static List GetModelList(Expression>whereLambda)
{returndal.GetModelList(whereLambda);
}
}
}
5.4 調(diào)用
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceADO.NETEFDemo
{classProgram
{static void Main(string[] args)
{
GetArticleList();
AddArticle();
GetArticleList();
UpdateArticle();
GetArticleList();
DeleteArticel();
GetArticleList();
Console.ReadKey();
}///
///更新///
private static voidUpdateArticle()
{int result = BLL.Update(e=> e.title.Contains("EF"), new[] { "title", "update_time"},new object[] { "我是使用EF修改過標(biāo)題的文章", DateTime.Now });if (result >= 0)
{
Console.WriteLine("更新成功");
}else{
Console.WriteLine("更新失敗");
}
Console.WriteLine();
}///
///刪除///
private static voidDeleteArticel()
{int result = BLL.Delete(e => e.title.Contains("EF"));if (result >= 0)
{
Console.WriteLine("刪除成功");
}else{
Console.WriteLine("刪除失敗");
}
Console.WriteLine();
}///
///新增///
private static voidAddArticle()
{
t_crobot_reship_articles model= newt_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.Add(model);if (result >= 0)
{
Console.WriteLine("新增成功");
}else{
Console.WriteLine("新增失敗");
}
Console.WriteLine();
}///
///獲取文章列表///
private static voidGetArticleList()
{
List articleList = BLL.GetModelList(e=> e.state == true);
Console.WriteLine("文章總數(shù):" +articleList.Count.ToString());foreach (t_crobot_reship_articles model inarticleList)
{
Console.WriteLine("標(biāo)題:" +model.title);
}
Console.WriteLine();
}
}
}
5.5 結(jié)果
6、小結(jié)
具體的操作步驟并不一定按文中所述的來。
總結(jié)
以上是生活随笔為你收集整理的连接mysql数据库2013_使用VS2013 + EF6 + .NET4.5 连接Mysql数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么进入工商银行网上登录页面
- 下一篇: mysql bench linux_My