共计 3881 个字符,预计需要花费 10 分钟才能阅读完成。
.NET Core1.1+VS2017RC+MySQL+EF 搭建多层 Web 应用程序,先贴上解决方案截图
一、新建 4 个解决方案文件夹
1-Presentation
2-Application
3-Domain
4-Infrastructure
二、在解决方案文件夹中分别创建项目
新建.NET Core Web 应用程序,【身份验证】需要选择【个人用户账户】否则无法执行 migrations 操作,猜想原因可能少了某个 NuGet 包,具体没去测试验证
如果不选【个人用户账户】,migrations 操作时会报【No executable found matching command “dotnet-ef”】错误
其余项目创建省略
项目引用关系:
1.ContosoUniversity.WebAdmin 引用 ContosoUniversity.Application、ContosoUniversity.Domain
2.ContosoUniversity.Application 引用 ContosoUniversity.Repository、ContosoUniversity.Domain
3.ContosoUniversity.Repository 引用 ContosoUniversity.Domain
4.ContosoUniversity.Domain 不引用任何项目
三、ContosoUniversity.Domain 项目中添加Microsoft.EntityFrameworkCore.Tools
1.1.0-preview4-final
NuGet 命令:Install-Package Microsoft.EntityFrameworkCore.Tools -Pre
四、ContosoUniversity.Domain 项目添加 Student、SchoolContext、DbInitializer 类
Student:POCO 对象,对应数据库中的 Student 表
SchoolContext:数据库上下文,用于数据库 CRUD 以及 Migrations 操作
DbInitializer:初始化数据库并添加测试数据
using System;
namespace ContosoUniversity.Domain
{public class Student
{public int ID {get; set; }
public string LastName {get; set; }
public string FirstMidName {get; set; }
public DateTime EnrollmentDate {get; set; }
}
}
using Microsoft.EntityFrameworkCore;
namespace ContosoUniversity.Domain.Data
{public class SchoolContext : DbContext
{public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
{ }
public DbSet<Student> Students {get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Student>().ToTable("Student");
}
}
}
using System;
using System.Linq;
namespace ContosoUniversity.Domain.Data
{public static class DbInitializer
{public static void Initialize(SchoolContext context)
{context.Database.EnsureCreated();
// Look for any students.
if (context.Students.Any())
{return; // DB has been seeded
}
var students = new Student[]
{new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")},
new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")},
new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")},
new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")},
new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")},
new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")},
new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")},
new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")}
};
foreach (Student s in students)
{context.Students.Add(s);
}
context.SaveChanges();}
}
}
五、ContosoUniversity.WebAdmin 项目修改
1.appsetting.json 文件添加 MySQL 连接字符串
"ConnectionStrings": {"DefaultConnection": "server=xxx;user id=xxx;password=xxx;database=ContosoUniversity;"
}
2. 添加 NuGet 包 MySql.Data 6.10.0-alpha、MySql.Data.EntityFrameworkCore 6.10.0-alpha、Microsoft.EntityFrameworkCore.Tools
1.1.0-preview4-final
MySql 版本不要选 7.0.6-IR31,项目跑起来会报 ”MySql.Data.EntityFrameworkCore.Storage.Internal.MySQLCommandBuilderFactory..ctor(ISensitiveDataLogger<RelationalCommandBuilderFactory> logger, DiagnosticSource diagnosticSource, IRelationalTypeMapper typeMapper)” 错误
3.StartUp 类 ConfigureServices 方法注入数据库上下文
public void ConfigureServices(IServiceCollection services)
{services.AddDbContext<SchoolContext>(options =>
options.UseMySQL(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("ContosoUniversity.WebAdmin")));
// Add framework services.
services.AddMvc();}
注意,标红的代码不可缺少,否则 EntityFramework 无法执行 Migrations,报错信息如下
4.StartUp 添加数据库初始化
改造 Configure 方法签名,添加 SchoolContext 参数
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, SchoolContext context)
Configure 方法末尾添加数据库初始化代码
DbInitializer.Initialize(context);
最后
把其余各层的代码都加上项目就可以跑起来了,通过 Migrations 操作维护开发库,.NET Core+MySQL+EF 使用 VS2017RC 构建项目的坑基本就是这些了。。
注意
NuGet 包 Install 或 Uninstall 命名执行后,查看 VS2017RC 中依赖的 NuGet 包发现没有变化(实际上已 Install 或Uninstall,VS2017RC 没有刷新),此时需要关闭解决方案重新打开,这时 NuGet 依赖才会刷新,这时 VS2017RC 的一个 BUG!
s