zoukankan      html  css  js  c++  java
  • 将数据库模型放入到.Net Core的类库中

    一、前提概要

          今年某天突然无聊,就决定学习.net core,此时的版本已经是.net core 1.1了。之前一直是用.net framework做项目,一直对Html.EditFor()等Html Helper不爽,感觉灵活性太差,此次看了微软的docs文档后,感觉到了.net core的强大之处,特别是Tag Helper,便决定投身到此平台中,但在新项目中发现了一个问题:之前做项目都是将数据库模型放在单独类库中,但现在发现.net core 类库的配置不一样,总是有问题,于是开始用bing的国际版(顺便鄙视下某度)搜索资料,在github的aspnet项目组的issues中和stackoverflowk中搜寻答案,终于找到了解决方法。

    二、参考资料

    https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet#targeting-class-library-projects-is-not-supported
    https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext
    http://benjii.me/2016/06/entity-framework-core-migrations-for-class-library-projects/
    https://github.com/aspnet/EntityFramework/issues/5320

    三、具体解决办法

    1、新建.net core web 应用程序名为TestMigrationInClassLibrary

    2、新建一个.net core class library 命名为NetDomain

    3、在TestMigrationInClassLibrary引用NetDomain

    4、在NetDomain类库中进行以下步骤:

    (1)在*.csproj中添加Microsoft.EntityFrameworkCore.Tools.DotNet

    <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
      </ItemGroup>

    (2)添加package Microsoft.EntityFrameworkCore.Design

    使用cmd控制器,进入该类库文件夹目录使用如下命令

    dotnet add package Microsoft.EntityFrameworkCore.Design

    添加上述两个必备文件后的*.csproj的最终样式如下:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp1.1</TargetFramework>
      </PropertyGroup>
      <ItemGroup>
        <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" PrivateAssets="All" />
      </ItemGroup>
      <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
      </ItemGroup>
    </Project>

    (3)利用nuget安装SqlServer

    Install-Package Microsoft.EntityFrameworkCore.SqlServer

    (4)添加Model

    public class Course
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public string Remarks { get; set; }
        }

    (5)添加DbContext

    public class CourseDbContext : DbContext
        {
            public CourseDbContext(DbContextOptions<CourseDbContext> options) : base(options)
            {
            }
    
            public DbSet<Course> Courses { get; set; }
        }

    (6)添加ContextFactory

    public class CourseDbContextFactory : IDbContextFactory<CourseDbContext>
        {
            public CourseDbContext Create(DbContextFactoryOptions options)
            {
                var optionsBuilder = new DbContextOptionsBuilder<CourseDbContext>();
                optionsBuilder.UseSqlServer("Server=(LocalDb)\MSSQLLocalDB;Database=TestClassLibrary;Trusted_Connection=True;MultipleActiveResultSets=true");
    
                return new CourseDbContext(optionsBuilder.Options);
            }
        }

    5、在类库所在目录下使用如下命令开启Migration

    dotnet ef --startup-project ../TestMigrationInClassLibrary migrations add Initial -c CourseDbContext

    要注意"../TestMigrationInClassLibrary"是作为类库的入口工程,没有这个入口的话,是无法启动Migration的。

    6、更新数据库

    dotnet ef database update --startup-project ../TestMigrationInClassLibrary

    同样也需要添加入口工程TestMigrationInClassLibrary

    四、总结

    因为.net core 类库不像.net standard类库一样具有启动功能,必须指定其他可启动的工程作为入口,所以每一次的Migration都得加上"--startup-project XXX"。

    为了能够将数据库模型独立出来,还是需要费一番周折,但是.net core的其他优点还是远远胜于传统的.net。要想入门.net core,还是建议多看微软官方的docs和去github中Fork下整个源代码。

  • 相关阅读:
    升级windows 11小工具
    windows 10更新升级方法
    您需要了解的有关 Oracle 数据库修补的所有信息
    Step by Step Apply Rolling PSU Patch In Oracle Database 12c RAC Environment
    Upgrade Oracle Database Manually from 12.2.0.1 to 19c
    如何应用版本更新 12.2.0.1.210420(补丁 32507738 – 2021 年 4 月 RU)
    xtrabackup 安装、备份和恢复
    Centos_Lvm expand capacity without restarting CentOS
    Centos_Lvm_Create pv vg lv and mount
    通过全备+relaylog同步恢复被drop的库或表
  • 原文地址:https://www.cnblogs.com/hahaxi/p/6771641.html
Copyright © 2011-2022 走看看