EF框架有三种基本的方式:DB First,Model First,Code First。这里简单的说一下Model First,适合没有基础的同学照着做,学习基础的东西。
1、建立一个类库项目,这个项目如果是在项目开发中,应该就是DB项目了,负责最底层的与数据库打交道的。
2、在项目中添加一个实体数据模型,然后选择空模型
3、在edmx文件中添加新实体。在这里,实体名称是项目中的类名;基类型是当前实体的父类,没有就不选择;实体集是这个实体在数据库中的表名;键属性是表的键,这里只支持
单一键
添加如下3个实体。
这3个实体是相互之间有关系的,right和user是多对多的关系,user和role是多对一的关系,因此需要将它们关联起来
在添加关联后,导航属性是自动添加的
4、根据模型生成数据库表,由于model first只负责添加新表,不会创建数据库,因此,需要先在sqlserver中建立数据库。在这里为了简单,就使用了sql系统的默认数据库model
点击完成后,会创建一个sql文件,内容就是创建3个实体的表和相关键值的sql语句
5、执行这个sql文件
点击connect后,系统自动会在sqlserver中创建相应的表。这个时候,需要去保存edmx文件,然后系统会自动在EfModelContainer类中添加相应的实体表的属性,并且创建相应
的实体类
6、在数据库中可以看到,系统自动添加了一个rightuser的关系表,这是因为这两个实体是多对多的关系,所以创建了这样一个关系表。同时,在user类中,自动
添加了两个virtual修饰的字段,它们都是user实体的导航属性。至此,从模型到数据库的创建就完成了。
7、下面来看看在modelfirst模式下,对数据库的增删改查
在类class1中添加如下代码 。这里只是简单的介绍,如果是在项目开发中,这些增删改查的代码一般不会放在这个项目中。
public class Class1 { //实例化数据库上下文 这个EfModelContainer是系统自动生成的局部类 EfModelContainer dbcontext = null; public Class1() { //实例化数据库上下文 dbcontext = new EfModelContainer(); } public IList<Role> getRoleSet() { //使用Lambda表达式查询数据 IList<Role> RoleList = dbcontext.RoleSet.Where(o => o.Name != "").ToList(); return RoleList; } public int AddRoleSet(Role r) { try { dbcontext.RoleSet.Add(r); dbcontext.SaveChanges();//对数据库的修改一定要添加这条语句 } catch (Exception e) { return 0; } return 1; } public int ModifyRoleSet(Role r) { IList<Role> rlist = dbcontext.RoleSet.Where(o => o.Id == r.Id).ToList(); Role rn = rlist.ElementAtOrDefault(0); if (null != rn) { rn = r; return dbcontext.SaveChanges(); } return 0; } public bool DelRoleSet(Role r) { try { dbcontext.RoleSet.Remove(r); dbcontext.SaveChanges(); } catch (Exception e) { return false; } return true; } }
8、创建一个控制台项目,添加modelfirst项目的引用。从modelfirst项目中将数据库字符串复制了放到控制台项目的配置文件中。这个字符串也是系统自动生成的,直接复制就行
static void Main(string[] args) { Class1 c = new Class1(); Role rnew = new Role() { Id = Guid.NewGuid(), Name = "科长" }; if (c.AddRoleSet(rnew) == 1) Console.WriteLine("数据添加成功。id:" + rnew.Id + ";name:" + rnew.Name); else Console.WriteLine("数据添加失败"); rnew.Name = "副科长"; if (c.ModifyRoleSet(rnew) == 1) Console.WriteLine("数据修改成功。id:" + rnew.Id + ";name:" + rnew.Name); else Console.WriteLine("数据修改失败"); //使用Lambda表达式查询数据 IList<Role> RoleList = c.getRoleSet(); //打印查询结果 if (RoleList.Any()) { foreach (Role r in RoleList) { Console.WriteLine(r.Name + "----" + r.Id); } } //if( c.DelRoleSet(rnew)) // Console.WriteLine("数据删除成功。"); //else // Console.WriteLine("数据删除失败"); Console.Read(); }
执行结果
9、现在数据库中有数据了,这个时候,如果需要添加新的表,或者对已有的表重新设计,需要特别的注意。
首先是要在edmx中添加相应的实体或者修改,弄完之后,右键菜单--》根据模型生成数据库,这个时候会重新生成新的sql文件来覆盖原来的。但是这个sql文件是要将原来的表
以及表的关系全部删除了,然后重新建立表,这样一来数据库中的数据就全没了,所以在这里千万不能去执行这个sql文件,如果非要执行,那必须先删除不需要的sql语句,保留
自己修改的那部分才能执行。另外就是自己手动到sqlserver中去做修改了。
在modelfirst模式下,如果要添加新表,必须先在模型中添加相应的实体,并且根据模型生成数据库后,还要在数据库中去添加表。如果是在项目开发中,这种对数据库结构有修改
的操作最好是由专人负责。
10、在user类中,通过关联关系,使得类中多了两个比较特殊的属性。属性role,类型是Role,在这里显的有点大材小用了,从数据库表中看,这个role本该表示roleid 的。在查询
user表中数据的时候,系统会自动的将属性role的所有信息都查出来放在属性role中,这在某些时候会导致user类的对象太大了,当然有些时候又是很方便的,这个就需要具体的分析
了。避免这样的情况就是不要去添加关联,直接在实体user中添加标量属性roleid就是了,当然设置外键可以在建好表之后再处理。