AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理、职称管理、部门管理、角色管理、角色权限管理等模块。

Entity Framework新增数据

以新增用户为例,作为对比,先来看下使用Subsonic的代码:

using (TransactionScope scope = new TransactionScope())
{
XUser item = new XUser();
item.Name = tbxName.Text.Trim();
item.ChineseName = tbxRealName.Text.Trim();
item.Gender = ddlGender.SelectedValue;
item.CompanyEmail = tbxEmail.Text.Trim();
item.PersonalEmail = tbxPersonalEmail.Text.Trim();
item.OfficePhone = tbxOfficePhone.Text.Trim();
item.OfficePhoneExt = tbxOfficePhoneExt.Text.Trim();
item.HomePhone = tbxHomePhone.Text.Trim();
item.CellPhone = tbxCellPhone.Text.Trim();
item.Remark = tbxRemark.Text.Trim();
item.Enabled = cbxEnabled.Checked;
//item.DeptId = Convert.ToInt32(ddlDept.SelectedValue);
item.CreateTime = DateTime.Now;
item.Save(); // 添加所有角色
if (!String.IsNullOrEmpty(hfSelectedRole.Text))
{
XRoleUserCollection roleUsers = new XRoleUserCollection();
foreach (string roleIdStr in hfSelectedRole.Text.Split(','))
{
int id = Convert.ToInt32(roleIdStr); XRoleUser roleUser = new XRoleUser();
roleUser.RoleId = id;
roleUser.UserId = item.Id; roleUsers.Add(roleUser);
}
roleUsers.SaveAll();
} scope.Complete();
}

由于需要操作两张表,所以使用了事务(TransactionScope),并在两个数据库操作全部完成之后调用 scope.Complete。

使用Entity Framework的代码无需使用事务,EF会正确的处理表关联,代码如下:  

User item = new User();
item.Name = tbxName.Text.Trim();
item.Password = PasswordUtil.CreateDbPassword(tbxPassword.Text.Trim());
item.ChineseName = tbxRealName.Text.Trim();
item.Gender = ddlGender.SelectedValue;
item.CompanyEmail = tbxCompanyEmail.Text.Trim();
item.Email = tbxEmail.Text.Trim();
item.OfficePhone = tbxOfficePhone.Text.Trim();
item.OfficePhoneExt = tbxOfficePhoneExt.Text.Trim();
item.HomePhone = tbxHomePhone.Text.Trim();
item.CellPhone = tbxCellPhone.Text.Trim();
item.Remark = tbxRemark.Text.Trim();
item.Enabled = cbxEnabled.Checked;
item.CreateTime = DateTime.Now; // 添加所有角色
if (!String.IsNullOrEmpty(hfSelectedRole.Text))
{
int[] roleIDs = StringUtil.GetIntArrayFromString(hfSelectedRole.Text); item.Roles = DB.Roles.Where(r => roleIDs.Contains(r.ID)).ToList();
} DB.Users.Add(item);
DB.SaveChanges();

上面的代码虽说可以正常运行,但是在设置用户角色列表时(item.Roles)进行了数据库查询,而这次查询可以通过Attach方法避免,更新后的版本:

User item = new User();
item.Name = tbxName.Text.Trim();
item.Password = PasswordUtil.CreateDbPassword(tbxPassword.Text.Trim());
item.ChineseName = tbxRealName.Text.Trim();
item.Gender = ddlGender.SelectedValue;
item.CompanyEmail = tbxCompanyEmail.Text.Trim();
item.Email = tbxEmail.Text.Trim();
item.OfficePhone = tbxOfficePhone.Text.Trim();
item.OfficePhoneExt = tbxOfficePhoneExt.Text.Trim();
item.HomePhone = tbxHomePhone.Text.Trim();
item.CellPhone = tbxCellPhone.Text.Trim();
item.Remark = tbxRemark.Text.Trim();
item.Enabled = cbxEnabled.Checked;
item.CreateTime = DateTime.Now; // 添加所有角色
if (!String.IsNullOrEmpty(hfSelectedRole.Text))
{
int[] roleIDs = StringUtil.GetIntArrayFromString(hfSelectedRole.Text); item.Roles = new List<Role>();
foreach (int roleID in roleIDs)
{
Role role = new Role { ID = roleID };
DB.Roles.Attach(role);
item.Roles.Add(role);
}
} DB.Users.Add(item);
DB.SaveChanges();

根据微软官方文档对Attach的解释:http://msdn.microsoft.com/en-us/data/jj592676 

If you have an entity that you know already exists in the database but which is not currently being tracked by the context then you can tell the context to track the entity using the Attach method on DbSet. The entity will be in the Unchanged state in the context.

Attach的数据已经存在数据库中,但是还没有被加载到EF上下文中 ,Attach后的实体处于Unchanged的状态。后面我们会有详细的博文讲解Attach,到时你会发现这里对Attach的用法其实还是有点问题的。

Entity Framework删除数据

最为对比,先来看下使用Subsonic如何删除一组用户:

new Delete().From<XUser>()
.Where(XUser.IdColumn).In(ids)
.Execute();

而使用EF的代码并不那么直观,因为在EF中删除数据之间要先把数据加载到EF上下文中,如下所示:

DB.Users.Where(u => ids.Contains(u.UserID)).ToList().ForEach(u => DB.Users.Remove(u));
DB.SaveChanges();

那么有没有办法像Subsonic一样删除数据呢?其实办法早就有了:https://github.com/loresoft/EntityFramework.Extended

我们需要在项目中添加这个库,然后在页面添加如下引用:

using EntityFramework.Extensions; 

现在的删除代码就简单多了:

DB.Users.Delete(u => ids.Contains(u.UserID));

  

Entity Framework修改数据

修改某个用户的属性,使用Subsonic的代码:

XUserCollection users = new Select().From<XUser>()
.Where(XUser.IdColumn).In(ids)
.ExecuteAsCollection<XUserCollection>();
foreach (XUser user in users)
{
user.Enabled = enabled;
}
users.BatchSave();

使用EF的代码也是类似的,先将需要修改数据的加载到内存中,然后修改:

DB.Users.Where(u => ids.Contains(u.UserID)).ToList().ForEach(u => u.Enabled = enabled);
DB.SaveChanges();

使用 EntityFramework.Extended 后,代码就更加简单了,并且减少了数据库连接次数:

DB.Users.Update(u => ids.Contains(u.UserID), u => new User { Enabled = enabled });

  

Entity Framework查询数据(数据库分页)

查询用户列表,并进行数据库分页的Subsonic代码如下所示:

SqlQuery q = new Select().From<XUser>();
q.Where("1").IsEqualTo("1"); // 在职务名称中搜索
string searchText = ttbSearchMessage.Text.Trim();
if (!String.IsNullOrEmpty(searchText))
{
q.And(XUser.NameColumn).ContainsString(searchText);
} // 过滤启用状态
if (rblEnableStatus.SelectedValue != "all")
{
q.And(XUser.EnabledColumn).IsEqualTo(rblEnableStatus.SelectedValue == "enabled" ? true : false);
} // 在查询添加之后,排序和分页之前获取总记录数
// Grid1总共有多少条记录
Grid1.RecordCount = q.GetRecordCount(); // 排列
q.OrderBys.Add(GetSortExpression(Grid1, XUser.Schema)); // 数据库分页
q.Paged(Grid1.PageIndex + 1, Grid1.PageSize);
XUserCollection items = q.ExecuteAsCollection<XUserCollection>(); Grid1.DataSource = items;
Grid1.DataBind();

使用Entity Framework的代码也很简单:

var q = DB.Users.Include(u => u.Dept);

// 在用户名称中搜索
string searchText = ttbSearchMessage.Text.Trim();
if (!String.IsNullOrEmpty(searchText))
{
q = q.Where(u => u.Name.Contains(searchText) || u.ChineseName.Contains(searchText) || u.EnglishName.Contains(searchText));
} // 过滤启用状态
if (rblEnableStatus.SelectedValue != "all")
{
q = q.Where(u => u.Enabled == (rblEnableStatus.SelectedValue == "enabled" ? true : false));
} // 在查询添加之后,排序和分页之前获取总记录数
Grid1.RecordCount = q.Count(); // 排列
q = q.OrderBy(u => u.Name); // 数据库分页
q = q.Skip(Grid1.PageIndex * Grid1.PageSize).Take(Grid1.PageSize); Grid1.DataSource = q;
Grid1.DataBind();

和Subsonic的代码类似,首先添加Where查询条件,然后数据库查询获取总记录数(q.Count),之后进行排序,最后是数据库分页。

美中不足的是排序,Entity Framework的OrderBy默认不支持字符串表示的列名!

没关系,下个版本我们会介绍如何向OrderBy传递字符串参数。

下载或捐赠AppBox

1. AppBox v2.1 是免费软件,免费提供下载:http://fineui.com/bbs/forum.php?mod=viewthread&tid=3788

2. AppBox v3.0 是捐赠软件,你可以通过捐赠作者来获取AppBox v3.0的全部源代码(http://fineui.com/donate/)。

AppBox升级进行时 - Entity Framework的增删改查的更多相关文章

  1. Entity Framework DBContext 增删改查深度解析

    Entity Framework DBContext 增删改查深度解析 有一段时间没有更新博客了,赶上今天外面下雨,而且没人约球,打算把最近对Entity Framework DBContext使用的 ...

  2. ASP.NET中使用Entity Framework开发增删改查的Demo(EF增删改查+母版页的使用)

    这里更多的是当作随身笔记使用,记录一下学到的知识,以便淡忘的时候能快速回顾 这里是该项目的第二部分, 第一部分 第二部分(当前部分) 大完结版本 此Demo是新建了一个音乐类型的web,然后使用母版页 ...

  3. Entity FrameWork 5 增删改查 & 直接调用sql语句

    class="brush:csharp;gutter:true;"> #region 1.0 新增 -void Add() /// <summary> /// 1 ...

  4. Entity FrameWork 5 增删改查 & 直接调用sql语句 ?

    #region 1.0 新增 -void Add() /// <summary> /// 1.0 新增 /// </summary> static void Add() { / ...

  5. Java对象转JSON时如何动态的增删改查属性

    1. 前言 日常开发中少不了JSON处理,少不了需要在JSON中添加额外字段或者删除特定字段的需求.今天我们就使用Jackson类库来实现这个功能. 2. JSON字符串增加额外字段 假如我们有这样结 ...

  6. Entity Framework 简单增删改操作

    前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...

  7. 使用Enitity Framework实现增删改查服务中的一些通用思路

    添加 → 方法参数中有一个有关添加视图模型类型的形参,比如vm→ 根据vm的某个属性,比如Name判断在上下文中是否存在,如果不存在就抛EntityNotFoundException异常→ 判断vm所 ...

  8. 一个使用MVC3+NHibernate “增删改查” 的项目(修正版)

      前言: 谈到NHibernate大伙并不陌生,搞Java的更是清楚,Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框架,它对Java的JDBC(类似于ADO.Net)进行了非常 ...

  9. AppBox升级进行时 - 拥抱Entity Framework的Code First开发模式

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 从Subsonic到Entity Framework Subsonic最早发布 ...

随机推荐

  1. web移动端fixed布局和input等表单的爱恨情仇 - 终极BUG,完美解决

    [问题]移动端开发,ios下当fixed属性和输入框input(这里不限于input,只要可以调用移动端输入法的都包括,如:textarea.HTML5中contenteditable等),同时存在的 ...

  2. VS2012 单元测试之泛型类(Generics Unit Test)

    关于单元测试,如果不会用可以参照我的上篇博文————在Visual Studio 2012使用单元测试 首先分享一篇博文,[Visual Studio] 开启Visual Studio 2012通过右 ...

  3. Linux2.6内核进程调度系列--scheduler_tick()函数1.总体思想

    参考的是ULK第三版,Linux2.6.11.12内核版本. 调度程序依靠几个函数来完成调度工作,其中最重要的第一个函数是scheduler_tick函数,主要步骤如下: /** * 维持当前最新的t ...

  4. 机器人聊天的小Demo

    先来张图,看看我们要做成什么样的效果.很简单的一个发送消息接收消息的界面,那怎么实现的呢,毫无疑问,是ListView的多布局了,右边显示我们发送消息的条目,左边显示要接收消息的条目.下面是一个Edi ...

  5. 蚂蚁金服寒泉子:JVM源码分析之临门一脚的OutOfMemoryError完全解读

    ➠更多技术干货请戳:听云博客 概述 OutOfMemoryError,说的是java.lang.OutOfMemoryError,是JDK里自带的异常,顾名思义,说的就是内存溢出,当我们的系统内存严重 ...

  6. RMAN还原遭遇ORA-32006&ORA-27102错误

    案例环境:   服务器A: 操作系统 : Red Hat Enterprise Linux ES release 4 (Nahant Update 6) 数据库版本: Oracle Database ...

  7. Linux SendMail发送邮件失败诊断案例(二)

    Linux上Sendmail经常由于一些配置问题,导致邮件发送失败,下面整理.收集了一些邮件发送失败.异常的案例. 案例1:在新服务器上测试sendmail发送邮件时,发现邮件发送不成功,检查/var ...

  8. DBCC CheckDB遇到a database snapshot could not be created

    在备份一个客户的数据库时(数据库版本为SQL 2005 Express版本),做DBCC CHECKDB时遇到了下面错误信息: dbcc checkdb('DB_NAME'); 消息 5030,级别 ...

  9. Java怎么添加背景图片

    首先,导入相关的包: import java.awt.BorderLayout; import java.awt.Container; import javax.swing.ImageIcon; im ...

  10. Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

    一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至 ...