• 将数据库模型放入到.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下整个源代码。

  • 相关阅读:
    iOS 即时通讯 + 仿微信聊天框架 + 源码
    Accelerate Framework in Swift
    最新 iOS 框架整体梳理(三)
    最新 iOS 框架整体梳理(二)
    单元测试
    iOS
    画个Shape留意到的东西
    deleteSections & deleteRows 我踩的坑
    常用开发技巧系列(六)
    程序员该如何提高睡眠质量?—程序媛233酱的助攻~
  • 原文地址:https://www.cnblogs.com/hahaxi/p/6771641.html
Copyright © 2020-2023  润新知