zoukankan      html  css  js  c++  java
  • EF Code First 初试

    1.建立类库项目,用来存放我们定义的映射数据表的实体类。

    2.EF框架已经添加到Nuget管理器中,可以在Nuget管理器命令行中输入"install-package entityframework"添加EF框架的依赖。默认项目一定要选对

    由于我已经安装过,所以就提示依赖已存在

    3.在对应的项目的配置文件中(如类库的默认配置文件就是"App.config")添加数据库连接字符串节点。

    4.新建一个项目的数据上下文类(大概就是类似于内存中的数据库上下文),继承DbContext类,将初始化字符串传到父类的构造,后期迁移也是通过此字符串传入到父类中,进行数据库连接的实例化。重写父类的方法:

     5.开始建立实体类,建立实体基类BaseEntity,建立一些通用的属性,比如Id,CreateTime等

    复制代码
    public class BaseEntity
        {
            public virtual Guid Id { get; set; } = new Guid();//id
            public virtual DateTime CreateTime { get; set; } = DateTime.Now;//数据创建时间
            public virtual bool IsRemove { get; set; }
        }
    复制代码

    继续建立自己所需的派生类,需要自己做好非空注解,外键注解等数据约束。

    复制代码
    namespace StudentSys.Models
    {
        public class Student:BaseEntity
        {
            [Required]//非空约束
            public string Name { get; set; }
            public string Sex { get; set; }
            public DateTime BornDate { get; set; }
            public string QQ { get; set; }
            public string Phone { get; set; }
            public string Email { get; set; }
            public string ImagePath { get; set; }
            [ForeignKey(nameof(Class))]//外键约束
            public Guid? ClassId { get; set; }
            public Class Class{ get; set; }
        }
    }
    复制代码

    6.建立好这些实体类之后,就要去数据上下文类中进行注册,表示这些类都对应一个数据库中一张表,用DbSet集合作为属性类型,映射后当作内存中存放数据表中的数据。

     7.做好这些准备工作之后,也就代表你的代码段的模型已经建立完成了,需要向数据库端进行迁移,打开Nuget管理器控制台按照以下流程输入命令。

      (1)控制台输入 PM> Enable-Migrations 如果出现黄色的提示,则跳转下一步,报错,请到文章末尾查看报错类型和解决方案。成功项目中会多一个Migrations目录

      (2)继续输入“add-migration createdb”,注意createdb可由咱们自行定义。此时Migrations目录中生成了一个名字很长的cs文件,可以看到其为咱们创建数据表的代码,ef对枚举、复杂类型、实体继承都提供了非常棒的知识,我们此时可以修改相应代码以生成我们希望看到的表结构。类名就是我们刚刚输入的名字。此时还没有和数据库端有任何关系,可以把这个类当作数据库的建库脚本,我们最后一步其实就是将这个类转化为sql语句然后在Sql Server中运行。

      (3)最后一步输"update-database",就是对远程数据端进行更改了。不报错则操作成功。

     8.打开数据库,就能看到生成的数据库和数据表已经存在了。

    问题和解决办法

      (1)提示”EntityType 'XXX' has no key defined“。

        解决办法:这是因为这里需要你所有的实体类都要指定主键,所以你的每个类要么有一个Id的属性要么有一个属性上面有[key]特性的标识。我这里是把Id定义在基类中。

      (2)提示”System.Data.SqlClient.SqlException (0x80131904): 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错)“

        解决办法:

          (1)查看服务中的对应数据库实例是否开启

          (2)网络配置中把TCP/IP选项打开,然后选中TCP/IP,右击属性,将所有的地址都启用

             (3) 查看Sql Server数据库属性中,允许远程是否已经被打开。尝试在服务配置管理中,将服务登陆账号修改为"内置账号",选择"Local System"。

           (4)以上还不行的话,卸载本地数据库

           (5)以上还不行的话,终极办法!!!在确保连接字符串正确的前提下,将连接字符串复制到DbContext的构造方法中。因为我观察到如果传入配置文件中连接字符串节点的key到这个构造的话,之后报错的连接字符串要比我的这个多了一个单词。如下就能成功解决上面的问题,至于原因还未知,希望大佬知道的话可以解惑,万分感谢。

     

  • 相关阅读:
    Mac连接远程Linux管理文件(samba)
    centos6 防火墙iptables操作整理
    安装postgresql
    linux CentOS6.5 yum安装mysql 5.6
    centos--git搭建之Gogs安装
    查看mysql 默认端口号和修改端口号
    centos之mysql安装配置使用
    流媒体服务器SRS部署
    redis配置文件参数说明
    redis 安装
  • 原文地址:https://www.cnblogs.com/liujianshe1990-/p/13189088.html
Copyright © 2011-2022 走看看