标签:
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