zoukankan      html  css  js  c++  java
  • Code First模式学习

    开篇

               因为前段时间一直学习mvc,当然小菜也知道在mvc中都主推使用EF模式来对数据库的访问,在学习mvc的过程中使用EF也遇到了很多问题,在这过程中也迷迷糊糊的一知半解,索性就决定从头开始学习使用EF,当然在EF中有三种模式的,Model First、Database First,当然这次主要是以学习Code First模式为准了。

    新建项目

    image

    使用NuGet联机添加了EntityFreamework

    该EntityFreamwork的版本是6.0.0.0

    添加Model

            因为codeFirst的模式就是代码现行的意思,现在我们就先添加Model文件夹,在下面添加一个People类

    public class People
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }

    这样子在CodeFirst的映射关系中,Id将会生成表的主键,当然遇到属性中如果不出现Id字样的话,编译的时候就会报错了,所以我要在类似的属性上加入标签[key]属性来标记此属性为表的Id主键

    public class Test
    {
    [Key]
    public int testName{get;set;}
    }

    重要的Dbcontext

         Dbcontext是EF中生成访问数据库的重要对象,我们可以通过它来对数据库做增、删、改、查的操作!

         在项目中新建一个PeopleContext的类

    class PeopleContext : DbContext
        {
            public DbSet<People> People { get; set; }
        }

        该PeopleContext最重要的是继承了DbContext

      利用Dbcontext访问数据库

    这里有些小的意外,当没有显示设置数据连接的时候,默认连接的数据库时:.SQLEXPRESS.如果本地没有SQLEXPRESS,EF会尝试LocalDb ((localdb)v11.0) .SQLEXPRESS,这个数据库时包含在vs2012中的

    此时并没有生成到sqlserver中,在在配置文件中加入connectionStrings的配置节

    <connectionStrings>
        <!--Data Source=.;Initial Catalog=GuestBook;Integrated Security=True-->
        <add name="PeopleContext" connectionString="Data Source=.;Initial Catalog= testPeople;Integrated Security=True" providerName="System.Data.SqlClient" />
      </connectionStrings>

    add name中必须和声明的class PeolpleContext一样

    这样子就可以在sqlserver中看到生成的数据库了

    image

    暂时不知道__MigrationHistory的作用,可能是为了数据迁移而生成的作用

    但是在指定了连接字符串后,在sqlserver中生成的数据库表名并不是Peoples而是但是的people,有待考究

    在表People中Id变成了主键并且是自动增长的

    下面是具体的映射关系

    数据库名:当没有显示设置数据,数据库的名称一般是DbContext的“命名空间.类名”,本例中是BreakAway.BreakAwayContext

    表名:表名默认为模型类名的复数形式,并且每个表都使用dbo构架创建。这里生成的就是dbo.Lodgings.

    主键:Code First会默认将以类似Id结尾来命名的属性当作主键,如ID,Id,本例中的DestinationId都自动设置为主键。如果该属性是int类型,Code First会在数据库中默认将该列设置为自增长。

    数据类型:在SQL Server中,字符串默认映射成nvarchar(max),byte[]映射成varbinary(max),bool映射成bit,decimal映射成decimal(18, 2),float映射成float。同时因为bool,decimal,float等是值类型,不能为给他们分配Null值。所生成的数据库会要求对应的列非空。如Lodgings表中的IsResort

    外键:Code First检测到模型间有一对多的关系,会自动在相应表中生成外键。在这时,Code First检测到Destination类中有一个List<Lodging> Lodgings属性,而在Lodging类中有一个Destination Destination属性,说明Destination与Lodging是一对多的关系,因而在Lodgings表中生成了外键Destination_DestinationId保存对应的DestinationId。外键的命名默认是导航属性名(这里是Destination)_对应主表的主键(这里是DestinationId)。

  • 相关阅读:
    设置lable内容不上下居中
    iOS中webView加载URL需要处理特殊字符
    搞一个app需要多久?
    戏说HTML5
    限制UITextField/UITextView的输入字数与中文输入之后的英文换行问题
    iOS6以后的单个控制器横竖屏显示以及旋转屏控制技巧,附带iOS8以后显示电池状态栏
    纯命令行教你Cocoapods的安装和使用
    iOS开发之各种动画各种页面切面效果
    UITextView/UITextField检测并过滤Emoji表情符号
    类里面的大括号{}加载顺序
  • 原文地址:https://www.cnblogs.com/ilooking/p/4108875.html
Copyright © 2011-2022 走看看