全国电子音乐交流中心

【EntityFramework系列】入门湿货(一)简单示例

歆视界2021-07-19 11:31:27

上一篇《【EntityFramework系列】入门干货》,介绍了Entity Framework的入门基础内容,今天手把手一步步的带你创建一个Entity Framework工程玩玩。


  • 在VS中,创建控制台应用EntityFrameworkDemo。

  • “工具——NuGet包管理器——管理解决方案的NuGet程序包”,搜索entityframework,勾选上一步创建的EntityFrameworkDemo项目,点击安装。(或者在“程序包管理器控制台”输入“Install-Package EntityFramework”命令,回车安装)。

  • 在项目的app.config配置文件中,添加数据库连接字符串配置项,并正确配置数据库连接字符串。


<connectionStrings>

   <add name="Test" connectionString="Data Source=DESKTOP-GAV5DS7;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=123456" providerName="System.Data.SqlClient" />

</connectionStrings>


  • 创建EDM实体数据模型。


public class User

{

    public int UserId { get; set; }

    public string Name { get; set; }

    public DateTime BirthDay { get; set; }

}


  • 创建数据库上下文类。


public class TestContext : DbContext

{

    public TestContext():base("Test"){ }

    public DbSet<User> Users { get; set; }

}


说明:数据库上下文类继承自DbContext,上一讲中有提到构造函数传数据库连接字符串的配置。DbSet<User>表示数据库中的表。集合中的每一个实体对象,代表表中的每一行数据。此时表的名称默认为上下文类中属性的名称“Users”。

  • 通过EF的API创建数据库

创建数据库的方式主要有两种:数据迁移、API。此处先介绍API方式。


public static void Main(string[] args)

{

    using (var context = new TestContext())

    {

        //如果数据库不存在时则创建

        context.Database.CreateIfNotExists();

    }

    Console.Write("数据库创建完成!");

    Console.Read();

}


最后,确保app.config中配置的数据库连接字符串正确,就可以运行程序了,等命令行输出“数据库创建完成!”即可。然后打开数据库,就可以看到已创建的Test数据库(数据库名在连接字符串中),以及新建的Users表。

同时,EF会创建一个名为“__MigrationHistory”的表。此表是用来记录数据迁移的,以后介绍数据迁移时,进行说明。

注意:EF默认将UserId作为了主键,代码中的string类型对应成了nvarchar(max),这些是EF的命名规范以及约定。

  • 简单的CRUD操作

此处介绍CRUD操作,只涉及Main函数代码的修改,修改后请自己运行程序,查看操作效果等。

1、Create操作


public static void Main(string[] args)

{

    using (var context = new TestContext())

    {

        //如果数据库不存在时则创建

        context.Database.CreateIfNotExists();

           var users = new List<User>

        {

            new User

            {

               Name   = "路人甲",

               BirthDay = new DateTime(2000, 1, 1)

            },

            new User

            {

                Name = "路人乙",

                BirthDay = new DateTime(2001, 2, 2)

            },

            new User

            {

                Name = "路人丙",

                BirthDay = new DateTime(2002, 3, 3)

            }

        };

 

        context.Users.AddRange(users);

        context.SaveChanges();

    }

    Console.Write("数据添加完成!");

    Console.Read();

}


2、Retrieve操作


public static void Main(string[] args)

{

    using (var context = new TestContext())

    {

        //如果数据库不存在时则创建

        context.Database.CreateIfNotExists();

        var userList = context.Users;

        Console.WriteLine("Id\t\t姓名\t\t出生日期");

        foreach (var user in userList)

        {

           Console.WriteLine("{0}\t\t{1}\t\t{2}", user.UserId, user.Name, user.BirthDay.ToShortDateString());

        }

    }

}


注意:EF的懒加载。

3、Update操作


public static void Main(string[] args)

{

    using (var context = new TestContext())

    {

        //如果数据库不存在时则创建

        context.Database.CreateIfNotExists();

        var userList = context.Users;

        if (userList.Any())

        {

            var toBeUpdated= userList.First(d => d.Name == "路人乙");

            toBeUpdated.Name = "路人";

            context.SaveChanges();

        }

    }

}


4、Delete操作


public static void Main(string[] args)

{

using (var context = new TestContext())

{

    //如果数据库不存在时则创建

    context.Database.CreateIfNotExists();

    var toBeDeleted = context.Users.Single(d => d.Name == "路人丙");

        if (toBeDeleted != null)

        {

           context.Users.Remove(toBeDeleted);

           context.SaveChanges();

    }

}

}


  • 加一张表

添加表的操作方法有数据库迁移、更改数据库模式等。此处介绍通过更改数据库模式来进行添加,数据库迁移的相关内容,在后面单独介绍。

比如添加一个省份表Provinces。按照上面的步骤进行添加,代码如下:


public class Province

{

    public int ProvinceId { get; set; }

    public string ProvinceName { get; set; }

}


在数据库上下文TestContext类中添加以下属性:


public DbSet<Province> Provinces { get; set; }


此时,运行程序,循环枚举省份,将会报错。因为数据库上下文与现在的数据库结构不匹配。为了解决这个问题,我们通过初始化器,来更改数据库模式。

1、创建初始化器Initializer。


public class Initializer : DropCreateDatabaseIfModelChanges<TestContext> { }


2、使用该初始化器。


public static void Main(string[] args)

{

    Database.SetInitializer(new Initializer());

    using (var context = new TestContext())

    {

        //如果数据库不存在时则创建

        context.Database.CreateIfNotExists();

        var provinceList = context.Provinces;

        provinceList.ToList();

    }

}


注意:因为上面的初始化器会销毁之前的数据库,所以之前累积的所有数据也都会丢失。很显然,这种用法不适合生产环境,但是我们学习EF或者项目早期是很方便的。以上代码中,最后一行调用ToList方法,原因也是因为EF的懒加载。

3、初始化器的其他功能

初始化器允许我们在目标数据库创建之后运行其他代码,可以通过重写Seed方法即可,比如添加原始数据。


public class Initializer : DropCreateDatabaseIfModelChanges<TestContext>

{

    protected override voidSeed(TestContext context)

    {

        context.Provinces.AddRange(new List<Province>

        {

            new Province{ ProvinceName="北京"},

            new Province{ ProvinceName="天津"},

            new Province{ ProvinceName="河北"}

        });

    }

}


Entity Framework的简单示例就介绍到这里。

下期预告:【EntityFramework系列】入门湿货(二)管理实体关系示例。