• Entity Framework学习笔记(一)


    请注明转载地址:http://www.cnblogs.com/arhat

    哈哈!老魏回来了,4月份的内容开始更新了,由于3月份时间都在做项目,没有时间写了,那么4月份老魏会尽可能的多写点东西的。那么4月份的内容主要是EF和Linq了。至于NHibernate没有更新完,后面有时间的话老魏会更新的。

    一、EF简介

    EF的全称是Entity Framework,是微软推出的一款ORM框架,和Nhibernate的作用是一样的,但是出自微软之手那么肯定在兼容性上要非常的到家。虽然EF是个迟来的产品,但是他的特性非常的好,比起NHibernate简直是简化太多了,比如我们不用在写那些映射文件了。好了,废话一堆了,开始介绍一下怎么使用EF吧。

    至于EF的知识,老魏在后面将会补上,因为老魏不是很新欢edmx文件把映射文件,实体文件都放在一起,这样不利于分层的设计的。

    今天主要把老魏分离EF的心得写出来,否则后面就要忘了!(汗,人老了!)

    二、EF分离环境的搭建

    这里呢,老魏使用的是MySql数据库,至于为什么不用SQL Server呢,主要是老魏的本本伤不起啊!所以老魏在学习EF的时候走了很多弯路啊!

    首先我们建立一个”Com.ArHat.EF”的解决方案,同时在解决方案中建立4个项目:

    1,Com.ArHat.DAL(类库)

    2,Com.ArHat.BLL(类库)

    3,Com.ArHat.Model(类库)

    4,Com.ArHat.Test(控制台应用程序)

    并添加他们之间的相互引用(小孩子都会了)。

    wps_clip_image-112

    然后,我们需要在Com.ArHat.Model添加一个edmx文件,也就是“ADO.NET 实体数据模型”。

    wps_clip_image-1456

    wps_clip_image-8149

    wps_clip_image-8809

    wps_clip_image-31634

    当我们添加完毕edmx文件后,更改一下edmx的属性,把“代码生成策略”改为”无”。因为我们要使用T4模板来分离edmx生成的文件,利于我们的分层,所以这里非常的重要。

    wps_clip_image-4509

    然后我们在edmx的设计界面右键点击,选择“添加代码生成项”。

    wps_clip_image-24154

    wps_clip_image-12602

    wps_clip_image-7237

    然后选择“POCO Generator With Validations”这个微软提供的T4模板。最后在Model项目中生成了2个T4文件和对应的.cs文件

    但是此时,我们会发生成的代码是有问题的,因为在Model项目中并没有引用“System.ComponentModel.DataAnnotations”的dll文件,所以加入这个文件,同时把生成的实体类中的  [MaxLength(50)]这个Attribute去掉,否则是错误的哦。

    接下的步骤就是复制粘贴了,我们把生成的School.Context.tt文件复制到DAL项目中,当然肯定要更改命名空间了!

    当我们把School.Context.tt复制到DAL项目中的时候,回发现School.Context.cs文件变成一个空文件了,不要担心,因为School.Context.tt找不到edmx文件了,此时我们打开这个文件并更改edmx的路径。如下所示:

    string inputFile = @"..\Com.ArHat.Model\School.edmx";

    然后我们保存tt文件,会发现此时的School.Context.cs文件又有内容了。但是编译的时候确实错的。

    wps_clip_image-17234

    原因是我们在DAL中没有引用System.Data.Entity.dll文件。添加一下引用就可以了。此时就基本上大功告成了,我们在BLL中写一个类用来测试一下我们的劳动成功吧!

    首先还要在BLL项目中添加”System.Data.Entity.dll”的引用。建立一个B_Student.cs文件,内容如下:

    public class B_Studnet
    
        {
    
              private DAL.SchoolEntities context = new DAL.SchoolEntities();
    
              public List<Model.student> GetAllStudent()
    
              {
    
                     var query = from stu in context.student
    
                                 orderby stu.sid
    
                                 select stu;
    
                    return query.ToList<Model.student>();
    
            }
    
        }

    然后我们在Com.ArHat.Test主项目中测试一下,代码如下:

    class Program
     {
    
        static void Main(string[] args)
    
        {
    
            BLL.B_Studnet studentBLL = new BLL.B_Studnet();
    
            foreach (Model.student stu in studentBLL.GetAllStudent())    
             {
    
                Console.WriteLine(stu.sname);
    
             }
    
         }
    
      }

    运行一下看看效果:

    wps_clip_image-7181

    哦,不。怎么可能报错呢.这是为什么呢?其实问题就出在程序运行的时候是查找的主项目中的App.config文件,而我们的链接字符串是在Model项目中生成的,所以在程序运行的时候,是无法找到的,解决方法就是把Model中的App.config文件复制到主项目中就可以了。然后我们在来测试一下。wps_clip_image-21730

    激动人心的时候终于到来了,成功了,我们成功了!呵呵。其实这也没什么的。通过上面的步骤,我们知道如何把edmx文件分成两个部分了,一个是实体类,一个是DbContext了。这样就达到了我们分层的目的了。
    好了,今天就到这里吧!

  • 相关阅读:
    流程控制值while 循环
    编程语言和变量
    计算机1&操作系统硬件
    使用 Cygwin 在 Windows 中使用 Linux 命令
    windows系统安装mysql及导库
    linux报错 OSError: [Errno 24] Too many open files
    python3报错ModuleNotFoundError: No module named 'Queue'
    mac版本intellij idea默认快捷键
    mysql初设密码及允许远程访问
    PyCharm 图标 c、m、F、f、v、p 分别代表什么含义?
  • 原文地址:https://www.cnblogs.com/arhat/p/3644276.html
Copyright © 2020-2023  润新知