本人最近开发项目 所用的开发工具为vs2015 ,以前开发网站都是用的微软的实体数据模型,并且数据库为sqlserver,这次也不例外,唯一不同的是这次需要连接mysql数据库,本想这侧也用实体数据模型,但是发现安装了mysqlserver,mysql for visual studio connector/net 之后依然没有办法使用实体数据模型,卡在实体数据模型向导
您引用了最新版本实体框架,但是找不到进行数据连接所需要的与此版本兼容的实体框架数据库提供程序, shit~~~~~~鼓捣了半天竟然没有成功(更新到最新版本的mysqlserver,mysql for visual studio connector/net),因此确认到目前为止2016年7月29日,mysql还没有弄出来与实体框架6.x相匹配的数据库提供程序。退到实体框架5竟然成功了,那也不行,因为本网站其他位置已经使用了实体框架6来连接sqlserver。
没办法只有使用数据集来连接数据库。但是数据集超不好用,改动一下就发现创建新的designer.cs 并对代码内容产生二义性。那也没法,如果不用数据集那么就只能亲自操作sql语句了,麻烦的要命。
最后形成了一套新的,可以在表之间“导航”(类似实体数据模型)的方法 现记录一下
比如有两个表 一个是area,一个是industry,用数据集生成了相关的xsd文件,并且自建了mysql类 areaTableAdapte类和industryTableAdapter类,并且mysql在命名空间models里,而那两个adapter类在Models.mysqlTableAdapters命名空间里
//如果需要建立关系则要记住两个表关系的名称
Models.mysql dataset = new Models.mysql();//获得一个实例
new Models.mysqlTableAdapters.areaTableAdapter().Fill(dataset.area);//填充实例
new Models.mysqlTableAdapters.industryTableAdapter().Fill(dataset.industry);//填充实例
//使用数据表
var rrr = dataset.fhk_cooperation_industry[0].GetChildRows("industry_industry");
var rrrd = dataset.fhk_cooperation_industry.Where(m=>m.fid==0).First().GetChildRows("industry_industry");
上例表明如需要进行表间导航,则需要先填充各表,也就是数据先要加载到内容,然后才可以利用表之间关系进行导航,这和实体数据模型不同,实体数据模型是按需来获取数据,不用先加载进来,这一点实体数据模型比较好。除了GetChildRows外,还存在GetParentRow和GetParentRows 同样可以在子向父导航。
另外因为实体数据模型是可视化的方式编写。与sqlserver严密继承。但是与其他数据库并不完全集成,瑕疵大大的。这里发现如果想利用mysql的 limit 在可视化界面里 进行分页是不可能的。会出现语法错误并且终止生成相应代码。所以要自己亲自来集成了 代码如下
/// <summary>
/// 为数据集提供补充
/// </summary>
/// <typeparam name="T">为Adapter类型,比如Models.mysqlTableAdapters.my_storeTableAdapter</typeparam>
/// <param name="datatable">需要填充的数据集</param>
/// <param name="cmdText">mysql语句或sql语句</param>
/// <param name="connectString_in_webcofig">设置在web.config里的连接字符串的名字</param>
/// <param name="ClearBeforeFill">填充前是否清空</param>
/// /// <returns>返回成功填充多少条</returns>
public static int MyFill<T>(System.Data.DataTable datatable, string cmdText, string connectString_in_webcofig,bool ClearBeforeFill) where T : System.ComponentModel.Component
{
var A = new Models.mysqlTableAdapters.fhk_cooperation_storeTableAdapter();
//var A = new T();
A.Adapter.SelectCommand = new MySql.Data.MySqlClient.MySqlCommand(cmdText);
A.Adapter.SelectCommand.Connection = new MySql.Data.MySqlClient.MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[connectString_in_webcofig].ConnectionString);
if(ClearBeforeFill == true)
{
datatable.Clear();
}
int returnValue = A.Adapter.Fill(datatable);
return returnValue;
}
调用方法为
var result = Models.MysqlExtend.MyFill<Models.mysqlTableAdapters.myTableAdapter>(dataset.datatable, "SELECT `id`, name` FROM `tableinmysql` limit 1,2", "ConnectionString", true);
这里引入的事datatable而不是dataset是因为dataset为引用类型,所以用不着担心dataset里针对datatable的引用会失效。
记住 dataset里有很多datatable而我们可以利用dataset内的关系来导航数据,前提是dataset已经填充过数据,并且有表间关系存在
使用方法
GetChildRows
GetParentRow
GetParentRows