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 classClass1
{//实例化数据库上下文 这个EfModelContainer是系统自动生成的局部类
EfModelContainer dbcontext = null;publicClass1()
{//实例化数据库上下文
dbcontext = newEfModelContainer();
}public IListgetRoleSet()
{//使用Lambda表达式查询数据
IList RoleList = dbcontext.RoleSet.Where(o => o.Name != "").ToList();returnRoleList;
}public intAddRoleSet(Role r)
{try{
dbcontext.RoleSet.Add(r);
dbcontext.SaveChanges();//对数据库的修改一定要添加这条语句
}catch(Exception e)
{return 0;
}return 1;
}public intModifyRoleSet(Role r)
{
IList rlist = dbcontext.RoleSet.Where(o => o.Id ==r.Id).ToList();
Role rn= rlist.ElementAtOrDefault(0);if (null !=rn)
{
rn=r;returndbcontext.SaveChanges();
}return 0;
}public boolDelRoleSet(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= newClass1();
Role rnew= new Role() { Id = Guid.NewGuid(), Name = "科长"};if (c.AddRoleSet(rnew) == 1)
Console.WriteLine("数据添加成功。id:" + rnew.Id + ";name:" +rnew.Name);elseConsole.WriteLine("数据添加失败");
rnew.Name= "副科长";if (c.ModifyRoleSet(rnew) == 1)
Console.WriteLine("数据修改成功。id:" + rnew.Id + ";name:" +rnew.Name);elseConsole.WriteLine("数据修改失败");//使用Lambda表达式查询数据
IList RoleList =c.getRoleSet();//打印查询结果
if(RoleList.Any())
{foreach (Role r inRoleList)
{
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就是了,当然设置外键可以在建好表之后再处理。