环境版本
EF的版本对应关系要求很严格,版本不兼容的时候在VS操作会出现无响应但是也没有任何报错的情况。
改程序在 VS2019 中创建
类型 | 环境/组件 | 版本 |
---|---|---|
系统安装 | MySQL Connector Net | 8.0.22 |
系统安装 | MySQL for Visual Studio | 1.2.9 |
NuGet下载安装 | MySql.Data | 8.0.22 |
NuGet下载安装 | MySql.Data.EntityFramework | 8.0.22 |
创建数据模型
- 右键项目,添加新建项,选择 ADO.NET 实体数据模型
- 选择来自数据库的EF设计器
- 选择自己要用的数据库链接,并为当前数据模型设置连接名称(此处使用 qdbEntities1 ),第一次创建时,需要新建链接(输入用户名密码选择对应数据库,并给当前新建的数据库链接创建一个别名),
- 点击下一步,选择需要同步的表
- 点击完成,等待数据模型创建成功即可
增、删、改、查 的简单使用(以上面的部门表 dept为例)
查询
/// <summary>
/// 查询列表
/// 以 ID 为例
/// </summary>
/// <param name="record"></param>
/// <returns></returns>
public List<dept> query(dept record)
{
//实例化上面创建的数据模型
using (qdbEntities1 myDb = new qdbEntities1())
{
//实例化 IQueryable<dept> 使用LINQ语法进行SQL操作
IQueryable<dept> db = myDb.dept;
if (record != null)
{
//id不为null 就按照ID查询
if (record.ID != null)
{
db = db.Where<dept>(p => p.ID.Equals(record.ID));
}
//...
}
//查询到默认的DTO(dept)
//return db.ToList();
//查到指定的DTO里面(自己指定对应字段、或对字段做出适当的调整)
return db.Select(q => new dept()
{
ID = q.ID,
NAME = q.NAME,
}).ToList();
}
}
关联查询
/// <summary>
/// 关联查询
/// </summary>
/// <param name="record"></param>
/// <returns></returns>
public List<dept> joinQuery()
{
using (qdbEntities1 myDb = new qdbEntities1())
{
//inner join
var result = from dept in myDb.dept
join role in myDb.role
//单字段匹配
//on dept.ID equals role.ROLE_ID
//多字段匹配
on new { ID= dept.ID, TEXT = dept.NAME } equals new { ID = role.ID, TEXT = role.NAME }
select new dept()
{
ID = dept.ID,
NAME = dept.NAME
};
//left outer join
result = from dept in myDb.dept
join role in myDb.role
on new { ID = dept.ID, TEXT = dept.NAME } equals new { ID = role.ID, TEXT = role.NAME }
//左连接 右表无数据关联时候默认右表的数据为null
into rightRow
from rw in rightRow.DefaultIfEmpty()
select new dept()
{
ID = dept.ID,
NAME = dept.NAME
};
return result.ToList();
}
}
新增
/// <summary>
/// 新增
/// </summary>
/// <param name="record"></param>
/// <returns></returns>
public long add(dept record)
{
using (qdbEntities1 myDb = new qdbEntities1())
{
myDb.dept.Add(record);
return myDb.SaveChanges();
}
}
删除
/// <summary>
/// 删除
/// </summary>
/// <param name="record"></param>
/// <returns></returns>
public long delete(dept record)
{
//删除单个数据
//using (qdbEntities1 con = new qdbEntities1()){
// 查找ID为1的第一个部门并删除
// var modelName = con.dept.Where(e=>e.ID == 1).FirstOrDefault();
// con.dept.Remove(modelName);
// return con.SaveChanges();
//}
//删除多个数据
using (qdbEntities1 con = new qdbEntities1()){
//查找部门名中存在管理部的并删除
var modelName = con.dept.Where(e => e.NAME.Contains("管理部")).ToList();
con.dept.RemoveRange(modelName);
return con.SaveChanges();
}
}
修改
/// <summary>
/// 修改
/// </summary>
/// <returns></returns>
public long update()
{
//查询后修改
using (qdbEntities1 con = new qdbEntities1())
{
//查询ID为1的第一个部门 将部门名称修改为xx部
var modelName = con.dept.Where(e => e.ID == 1).FirstOrDefault();
modelName.NAME = "xx部";
return con.SaveChanges();
}
//根据ID修改对象(会清空Model中不包含的属性,如下除了ID和NAME 其他字段都会被修改为空)
using (qdbEntities1 con = new qdbEntities1()){
dept dp = new dept()
{
ID = 1,
NAME = "fieldValue",
};
//Attach:将给定实体以System.Data.EntityState.Unchanged状态附加到上下文中
con.dept.Attach(dp);
return con.SaveChanges();
}
//根据ID修改对象(不清空Model中不包含的属性)
using (qdbEntities1 con = new qdbEntities1())
{
dept dp = new dept()
{
ID = 1,
NAME = "xx部",
};
//设置模型状态为尚未经过修改
con.Entry(dp).State = EntityState.Unchanged;
//设置哪些列做了修改,EF就会生成只修改对应列的SQL语句
con.Entry(dp).Property(p => p.NAME).IsModified = true;
return con.SaveChanges();
}
}