.NetCore下使用EF DbFirst操作MySql
新建.NetCore的控制台项目
使用Nuget安装Pomelo.entityframeworkcore.mysql
工程右键--->编辑.csproj文件,把以下内容写入到工程文件
<ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.1.1" /> </ItemGroup>
修改后工程文件如下
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.1.1" /> <PackageReference Include="Snowflake.NetCore" Version="1.0.0" /> </ItemGroup> <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.1.1" /> </ItemGroup> </Project>
打开命令行,cd到项目根目录(.csproj所在目录)下,执行如下命令:
dotnet ef dbcontext scaffold "server=localhost;uid=root;pwd=123456;port=3306;database=document;" "Pomelo.EntityFrameworkCore.MySql"-o EF -f
参数说明
-o 输出目录(-OutputDir)
-f 覆盖现有文件(-Force),数据库更新时会用到
-t 指定表名(-Tables)
如果中间出错,请先确保你的工程文件可以编译成功,并使用-f参数覆盖现有文件
执行成功后就可以看到相应的Context和model了。
对于生成的文件,我们不作任何修改,以免更新时造成冲突。
创建我们自己的ContextConfig类
using Microsoft.EntityFrameworkCore; namespace EF2MySqlDBFirst.EF { public class DataBaseContextConfig { private const string LightConnectionString = "server=localhost;userid=root;pwd=123456;port=3306;database=light;"; private const string LogConnectionString = "server=localhost;userid=root;pwd=123456;port=3306;database=log;"; /// <summary> /// 创建Light数据库上下文 /// </summary> /// <returns></returns> public static lightContext CreateLightContext() { var optionBuilder = new DbContextOptionsBuilder<lightContext>(); optionBuilder.UseMySql(LightConnectionString); var context = new lightContext(optionBuilder.Options); return context; } /// <summary> /// 创建log数据库上下文 /// </summary> /// <returns></returns> public static logContext CreateLogContext() { var optionBuilder = new DbContextOptionsBuilder<logContext>(); optionBuilder.UseMySql(LogConnectionString); var context = new logContext(optionBuilder.Options); return context; } } }
这样使用context对象时,用我们自己生成的类的CreateContex方法创建,保证数据库更新时重新生成的代码对我们的程序没有影响。
测试
static void Main(string[] args) { using (var context = DataBaseContextConfig.CreateLightContext()) { context.User.Add(new User { Age = 22, CreateTime = DateTime.Now, UserName = "zisi", UserId = new IdWorker(1, 1).NextId(), Status = 1, }); context.SaveChanges(); Console.WriteLine("New date:" + context.User.OrderByDescending(u => u.UserId).FirstOrDefault().CreateTime); } Console.WriteLine("press enter to exit!"); Console.ReadLine(); }