随笔 - 290  文章 - 10  评论 - 84  2

因为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

 
posted on 2018-04-08 10:36  Gu  阅读(...)  评论(... 编辑 收藏