小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
在VS里面新建控制台项目,项目目录如下:
在建完控制台应用程序后在项目上添加【ADO.Net实体数据模型】,然后选择空的EF设计器模型。在设计器里面添加两个实体,实体关联成1对多的关系,然后再vs里面需要手动添加代码生成项,在设计器里面右键然后添加代码生成项,命名与实体数据模型相同,添加后会自动组织到DataModel.edmx下面。然后右键生成数据库,之后新建数据库生成脚本(DataModel.edmx.sql)执行脚本后数据库和模型就完成了。
使用EF进行简单的增删改查,首先创建数据上下文,这个数据上下文名字是EF自动生成需要到DataModel.Context.cs里面去查看。
DataModelContainer dbContext = new DataModelContainer();
1、新增
UserInfo userInfo = new UserInfo();
userInfo.UName = "刘备";
dbContext.UserInfo.Add(userInfo);
OrderInfo order1 = new OrderInfo();
order1.Content = "第一个订单";
dbContext.OrderInfo.Add(order1);
OrderInfo order2 = new OrderInfo();
order2.Content = "第二个订单";
dbContext.OrderInfo.Add(order2);
//关联三个实体(3种方式关联导航属性)
//1、通过用户添加订单实体到自己的导航实体
userInfo.OrderInfo.Add(order1);
//2、通过订单指定用户实体
order2.UserInfo = userInfo;
//3、外键关联(如果UserInfo ID已经存在 不然只能用上面两种)
//order2.UserInfoID = userInfo.ID;
2、修改
UserInfo userInfoModify = new UserInfo();
userInfoModify.ID = 1;
userInfoModify.UName = "孙权";
dbContext.Entry(userInfoModify).State = System.Data.Entity.EntityState.Modified;
//修改单个属性
//dbContext.Entry(userInfoModify).Property(u => u.UName).IsModified = true;
3、删除
OrderInfo orderInfoDel = new OrderInfo();
orderInfoDel.ID = 2;
dbContext.Entry(orderInfoDel).State = System.Data.Entity.EntityState.Deleted;
4、查询
IQueryable<UserInfo> temp = from u in dbContext.UserInfo
where u.ID > 0
select u;
//1、linq表达式转成Expression类型
//2、给Type ElementType赋值
//3、给Iqueryable Provider赋值,ef provider(根据dbcontext 数据上下文)
foreach (var user in temp)
{
Console.WriteLine("ID:" + user.ID + " UName:" + user.UName);
}
Linq 可以 to (sql,ef,object.....)其原理就是IQueryable接口。接口中有三个属性如图:
其中Expression是表达式目录树实例描述表达式(实际是一颗表达式树),例如lambad表达式:System.Linq.Expressions.Expression<Func<int, bool>> expression = a => a> 0; 也可以转换成Expression实例,同样Linq表达式也转换成Expression。 而Type就是表示表达式类型,列如表达式的类型是linq 还是Lambad等。 Provider则是根据当前初始化的Provider(此处是EF Provider)进行解析执行表达式。
5、延迟加载
IQueryable<UserInfo> temp1 = from u in dbContext.UserInfo
where u.ID > 0
select u;
//第一种延迟加载是temp1在没用使用的时候 数据还没有查询出来。在用作其他linq查询时是当做子查询语句。
IQueryable<UserInfo> temp2 = from u in temp1
where u.UName != string.Empty
select u;
foreach (var user in temp2)
{
Console.WriteLine("ID:" + user.ID + " UName:" + user.UName);
}
//第二种延迟加载 在模型对象里面有导航属性时候,当导航属性没有手动加载数据时我们使用导航属性EF会自动根据当前模型对象信息查询导航属性数据
foreach (var user in temp2)
{
foreach (var order in user.OrderInfo)
{
Console.WriteLine("ID:" + order.ID + " Content:" + order.Content);
}
}
最后以上操作需要调用 dbContext.SaveChanges(); 把上面的实体变化封装成sql 执行到数据库里面。