码迷,mamicode.com
首页 > Web开发 > 详细

ASP.NET5实践02:EF7迁移-连接字符串读取-增删改查-关系映射

时间:2015-12-12 20:10:59      阅读:755      评论:0      收藏:0      [点我收藏+]

标签:

1.概述


本章重点本应该先从实体关系映射介绍,就像做网页设计先从整体布局开始一样。

最好先基本搞明白实体关系映射到数据表关联关系之后,再研究实体属性或表字段细节。

EF7.x和EF6.x区别是很大的。EF7为了迎合NoSql,与以前单一处理关系型数据库映射有一些不同的理念。

在讲这之前,我们先学习EF7迁移和数据库字符串配置读写。

这算准备工作,虽然有些啰嗦,但这是写这篇博客的思路。既然是实践系列,就边体验便写博客!

2.手动迁移


实体类:

    public class Role
    {
        public int Id { get; set; }
        public string RoleName { get; set; }
    }

project.json依赖和commands配置:

  "commands": {
    "Run": "EFConsole",
    "ef": "EntityFramework.Commands"
  },

  "frameworks": {
    "dnxcore50": {
      "dependencies": {
        "Microsoft.CSharp": "4.0.1-beta-23516",
        "System.Collections": "4.0.11-beta-23516",
        "System.Console": "4.0.0-beta-23516",
        "System.Linq": "4.0.1-beta-23516",
        "System.Threading": "4.0.11-beta-23516",
        "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
        "EntityFramework.Commands": "7.0.0-rc1-final"
      }
    }
  }

注:这里需要使用dnxcore50,所以安装一下coreclr:

技术分享

上下文类:

    public class EFContext : DbContext
    {
        public DbSet<Role> Roles { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=.;Database=Test;User ID=sa;Password=123456");
        }
    }

在vs中,打开程序包管理器控制台:

先试一下dnx能用不:

技术分享

进入项目目录,并查看ef命令:

技术分享

添加迁移:

技术分享

更新迁移到数据库:

技术分享

查看数据库:

技术分享

3.自动迁移


使用命令来手动迁移,有时很方便,但不适合“懒人”,最好改为程序运行时,自动迁移,并初始化数据。

数据库初始化方法:

    public static class SampleData
    {
        public static void Initialize()
        {
            EFContext db = new EFContext();

            db.Database.EnsureDeleted();
            db.Database.EnsureCreated();

            db.Roles.Add(new Role { RoleName = "manager" });
            db.SaveChanges();
        }
    }

执行:

    public class Program
    {
        public static void Main(string[] args)
        {
            //初始化数据库
            SampleData.Initialize();

            Console.WriteLine("ok");
            Console.ReadLine();
        }
    }

运行后,查看数据:
技术分享

4.连接字符串读写


 添加appsettings.json:

{
    "Data": {
    "Connection": {
      "ConnectionString": "Server=.;Database=Test;User ID=sa;Password=123456"
    }
    }
}

修改上下文:

    public class EFContext : DbContext
    {
        public DbSet<Role> Roles { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //optionsBuilder.UseSqlServer(@"Server=.;Database=Test;User ID=sa;Password=123456");

            optionsBuilder.UseSqlServer(Configuration["Data:Connection:ConnectionString"]);
        }
public IConfigurationRoot Configuration { get; set; }
public EFContext() { var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json"); builder.AddEnvironmentVariables(); Configuration = builder.Build(); } }

5.查询数据


            using (var db = new EFContext())
            {
                //查询
                var list = db.Roles.ToList();
                foreach (var item in list)
                {
                    Console.WriteLine(item.RoleName);
                }
            }

6.添加数据


            using (var db = new EFContext())
            {
                //添加
                db.Roles.Add(new Role { RoleName = "member" });
                db.SaveChanges();

                //查询
            }

7.修改数据


            using (var db = new EFContext())
            {
                //修改
                var role = db.Roles.Single(r => r.RoleName == "member");
                role.RoleName = "member2";
                db.ChangeTracker.AcceptAllChanges();
                db.SaveChanges();

                //查询
             }

8.删除数据


            using (var db = new EFContext())
            {
                //删除
                var role = db.Roles.Single(r => r.RoleName == "member2");
                db.Roles.Remove(role);
                db.SaveChanges();

                //查询
            }

9.1对多关系


角色实体:

    public class Role
    {
        public int Id { get; set; }
        public string RoleName { get; set; }

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

用户实体:

    public class User
    {
        public int Id { get; set; }

        public string UserName { get; set; }

        public int RoleId { get; set; }

        public Role Role { get; set; }
    }

执行迁移后,查看数据库关系图:
技术分享

注:User表的外键是强约束! 

10.多对多关系


 角色实体修改:

    public class Role
    {
        public int Id { get; set; }
        public string RoleName { get; set; }
    }

用户实体修改:

    public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }
    }

添加关联实体:

    public class UserRole
    {
        public int Id { get; set; }

        public int RoleId { get; set; }
        public Role Role { get; set; }

        public int UserId { get; set; }
        public User User { get; set; }
    }

执行迁移后,查看数据库关系图:

技术分享

11.小结


好啦!本章又到此结束!文中有些代码不严谨,仅供参考!

另外实体关系还有1对1,0或1 对多关系等,读者自行研究啦!

相信你也看到了多对多关系,实体类写法与EF6.x版本不同啦!

原因EF7.x采用是one to many方式,没有直接many to many!

这符合NoSql数据结构,所以关系型数据库切换到NoSql数据库,实体类无需变换!

当然更多,更详细介绍,参看https://ef.readthedocs.org/

 

ASP.NET5实践02:EF7迁移-连接字符串读取-增删改查-关系映射

标签:

原文地址:http://www.cnblogs.com/givecase/p/5041620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!