因为Mac 不能装SqlServer, 所以把数据库迁移到MySql,然后EntityFramework要改成Pomelo.EntityFrameworkCore.MySql
数据库迁移时,nvarchar 要改成varchar,编码选utf-8
在Startup.cs里
public void ConfigureServices(IServiceCollection services) { //Use MySql----------------------- string connString = "Server=localhost;Port=3306;Database=test;User=root;Password=xxx;"; services.AddDbContextPool<CRMContext>(tt => tt.UseMySql(connString)); }
CRMContext类
public class CRMContext: DbContext { public CRMContext(DbContextOptions<CRMContext> options): base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { //手工指定table名 //modelBuilder.Entity<User>().ToTable("User"); //批量指定前缀CRM foreach (var entity in modelBuilder.Model.GetEntityTypes()) { entity.Relational().TableName = $"CRM{entity.ClrType.Name}"; } //base.OnModelCreating(modelBuilder); } //https://stackoverflow.com/questions/4270794/why-is-my-dbcontext-dbset-null //必须设为property,如果是field,则会一直为null public DbSet<User> Users { get; set; } public DbSet<Department> Departments{ get; set; } } }
在Controller里可以通过构造函数,依赖注入使用
[Route("api/[controller]")] public class UserController : Controller { private readonly CRMContext _context; public UserController(CRMContext context) { _context = context; } // GET: api/values [HttpGet] public IEnumerable<string> Get() { return _context.Users.Select(tt=>tt.UserName).ToList(); } }
netCore的solution里多了一个WWWRoot的文件夹,里面都是放一些静态文件js,css,image等, 这个目录默认就是网站根目录,这样把动态文件和静态文件完全分离开了.
请参考这篇文章: ASP.NET Core使用静态文件、目录游览与MIME类型管理
如果要用多数据库迁移.可以这样
//Use MySql----------------------- //services.AddDbContextPool<CRMContext>(tt => tt.UseMySql(Configuration.GetConnectionString("MySqlConnection"))); //-----Use SqlServer, 默认用offset分页(这个是sql2012版本之后才有的功能),之前的版本要改成RowNumber分页
services.AddDbContextPool<CRMContext>( tt => tt.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection"), opt=>opt.UseRowNumberForPaging()) );
把多个数据库连接写在appsetting.json
{ "ConnectionStrings": { "SqlServerConnection": "Server=.\\sqlexpress;Database=test;User ID=sa;Password=xxxx;", "MySqlConnection": "Server=localhost;Port=3306;Database=test;User=root;Password=xxxx;" }, "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Warning" } } }
用dotnet ef的命令迁移数据库.
dotnet build
dotnet ef migrations remove
dotnet ef migrations add Initial
dotnet ef database update Initial
pause
如果出错, 未找到与命令“dotnet-ef”匹配的可执行文件,
请参考这个http://www.cnblogs.com/dupeng0811/p/no-executable-found-matching-command-dotnet-ef.html
如果出错,
The current CSharpHelper cannot scaffold literals of type 'Microsoft.EntityFrameworkCore.Metadata.Internal.DirectConstructorBinding'. Configure your services to use one that can.
解决方案:程序包管理控制台->Install-Package Microsoft.EntityFrameworkCore.Design
如果出现这个错误:
table 'TableName' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
要在DbContext文件里指定
modelBuilder.Entity<Product>().HasOne(p => p.Category) .WithMany(c => c.Products).OnDelete(DeleteBehavior.Restrict) .HasForeignKey(p => p.CategoryId);
对比Data Annotation, Fluent API
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
2010-04-08 Afterlogic xmail 邮局软件不能收email 设置