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)。

原文地址:https://www.cnblogs.com/ilooking/p/4108875.html