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下整个源代码。

  • 相关阅读:
    vbs获取当月的第一天和最后一天的日期
    vbscript基础篇
    win10专业版激活
    python selenium中Excel数据维护
    python里面的xlrd模块详解
    python 转换为json时候 汉字编码问题
    用VBA得到EXCEL表格中的行数和列数
    表关联关系,表的复制
    存储引擎,详细建表语句,数据类型,约束
    数据库基础
  • 原文地址:https://www.cnblogs.com/hahaxi/p/6771641.html
Copyright © 2011-2022 走看看