学习WCF\WPF\EF技术(三)

来源:互联网 发布:淘宝的经营模式 编辑:程序博客网 时间:2024/04/30 07:51
  Code First介绍(引用自《Entity Framework Code-First 文章汇集》部分内容)
   从字面上就不难看出这是一种以代码为中心,代码优先的开发模式.而且使用它之后允许你:

  • 在不使用设计器或者定义一个 XML 映射文件的情况下进行开发。
  • 允许编写简单的模型对象POCO (plain old classes),而不需要基类。
  • 通过"约定优于配置",使得数据库持久层不需要任何的配置
  • 也可以覆盖"约定优于配置",通过流畅的 API 来完全定制持层的映射。

使用Codefirst这个模式后,你的项目中可以说就不再需要.edmx这种系统自动生成的Data Model了。

  1.首先在项目中添加一个"Model类库"项目(作用是准备EF使用的实体对象模型),依然是在"文件"->"新建项目"->"类库",并选择添加到现有解决方案中.另外对该项目添加EF的功能,可以参考这个上篇文章,只需要添加引用就可以了,不需要对App.config进行额外配置.然后在"web"和"wcf"两个项目中添加对当前"model"项目的引用.

2.手动创建model,分别是用户类\用户组类以及表示使用数据库的实体类(简单说就是用哪个数据库\"database")


User类


Group类


UsersContext类("数据库"类),这个类的类名对应在web.config之中的<connectionString>名.我通过创建构造函数的方法,关闭了延迟加载功能,这样做的好处就是可以选择我需要的对象数据,而不需要把全部关联的对象数据取出来.等我们需要全部关联的数据可以使用Include()方法来加载关联的对象数据.

注意:为每个类添加System.ComponentModel.DataAnnotations命名空间,它是帮助我们对实体类在数据库中属性信息的限定\描述.如上图中[Key]表示是主键,[Required]是必填即作用如我们建立数据库过程中,设置该某字段"NOTNULL",[MaxLength(50)]表示最大长度,string类型的属性通过EF功能在数据库中创建后的类型为nvarchar.

2.接下来在"Service"类中添加方法.(这里是我们对数据库操作,不知道可不可以将这层称之为DAL层)

添加方法:在ef中,无论是添加\修改\删除操作,都需要我们手动先查出要操作的对象是否存在,然后ef会跟踪该对象的状态,最后通过"SaveChanges()"方法来执行操作.

先获取到每张表所有数据的对象(groups\users),通过model传进来的用户组id(gid)查到用户组对象(group),我使用的是Find()方法,其括号中传入的是主键值,并且如果该表有多个主键则需要一一传入,好了查询到对象之后要把这个含有完整信息的group对象重新复制给model(因为两个表是关联着的,信息不全是不允许你添加单表的),并调用users的Add方法把model即类型为User的对象添加到users中,注意这步实际上并未对数据库进行添加操作,要调用"数据库"也就是UsersContext对象的SaveChanges()方法才会真正的保存到数据库.SaveChanges()方法会返回int类型的结果参数,未操作成功会返回0.


删除操作,调用Remove()方法.


查询一条记录取出我需要的属性
之所以这么查询是觉得这样有选择查询出几个属性(字段)更符合我们实际做项目中的情况,通常取出全部信息的情况不多,而且"要什么取什么"比"从全部中拿"要更节省资源.
该方法我使用了linq toEntity方法,先是使用Include()方法设置要关联查询Group属性(在这里你只需要声明下哪个属性就可以了.至于用什么外键等等操作则不用你处理,体现了EF的优点).然后分别使用Where()方法设置查询的条件,并用Select()方法配合new{}(创建内部匿名变量)来实现"要什么取什么",最后并且使用AsNoTracking()方法来提高查询的效率,这里也还需要特别注意的是使用AsNoTracking()方法了是不能再对当前数据库对象进行添加\修改\删除操作的,因为AsNoTracking()方法是关闭了跟踪数据库对象状态的功能.FirstOrDefalut()方法作用则是取第一个符合条件的记录,如果没有则返回默认值(空或者其他),尽量不要使用First()方法,因为它查询的结果如果为Null则会抛出异常.



还是查询操作,这次结果为一个属性,则直接使用匿名赋值的方式(不知道这种方式的叫法对不对,请高人指正)



更新操作,依然是先通过主键查出要修改的对象,然后直接修改(赋值)这个对象,最后直接SaveChanges()方法就可以了,我写这个方法时候还有个小插曲,自己手动给几个属性赋值,赋的值为空,然后我调用此方法调试,总是报异常,但是没有相关提示,最后搜到文章可以通过捕获DbEntityValidationException异常来显示信息,结果一看是自己忘了在User类中设置属性为Required的声明,所以才不会更新成功.>_<

   "Service"完事了,下面该"Client"了.下面实例是一个这个用户信息管理登录的一段代码,用来示意通过代理的方式调用"WCF"提供的服务方法.



using代码块中通过new一个UserCMSWCFServiceClient对象来为我们提供服务,调取"WCF"中的方法.注意别忘了每次WCF服务中添加新方法后,要更新引用服务.

写到这里时,我已经把项目加上了log4net功能,感兴趣的朋友可以往后文看.