zoukankan      html  css  js  c++  java
  • 使用Entity Framework Core访问数据库(DB2篇)

    前言

    上一篇讲了一些EF Core访问Oracle的坑。(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)

    这篇主要讲一下关于EF Core访问DB2的一揽子~问题。

    本篇采用DBFirst直接生成实体。

     关于EF Core DB2 的官方文档:点这里(E文好的可以参考)

    正文

    1.生成上下文实体,并访问数据库

       首先我们当然是生成上下文实体啦~

        我们创建一个空的控制台程序如下:

    然后Nuget添加引用:

    Microsoft.EntityFrameworkCore.Tools(DBFirst的生成工具 必须的)

    IBM.EntityFrameworkCore(DB2官方的库,这个库请注意,是Windows版本的,后面我们讲解各类版本的区别)

    然后我们打开Nuget控制台

    输入DBFirst的生成语句 生成上下文,语句如下:

    Scaffold-DbContext "这里是你的连接字符串;" IBM.EntityFrameworkCore  

    生成效果如下:

    这样我们就生成了我们的上下文实体。

    我们编写一个简单的查询语句,查询一下Price表的数据量:

     class Program
        {
            static void Main(string[] args)
            {
                using (MYTESTDBContext db = new MYTESTDBContext())
                {
                   var date =  db.Price.Count();
                    Console.WriteLine(date);
                    Console.ReadLine();
                }
            }
        }

    效果如下:

    证明我们的上下文是没什么问题的,至此关于Windows系统的DB2访问。。就完美结束了。。

    2.关于在其他系统使用DB2的小问题。

    上面我们使用的开发机是windows系统,所以直接引用了

    IBM.EntityFrameworkCore包。

    但是我们在Nuget搜索关键字IBM.EntityFrameworkCore

    你会发现它有三个包,如下:

    So...一脸黑人懵比。。

    其实在官方文档中已经解释过了。

    Windows系统使用:IBM.EntityFrameworkCore

    Linux系统使用:IBM.EntityFrameworkCore-Inx

    MacOS系统使用:IBM.EntityFrameworkCore-osx

    在生成上下文的时候,前面的步骤无需改动。最后生成的语句改成你对应的dll即可。

    所以 有些在MacOS本上使用VS code的兄弟。。请引用osx的包哦。

     

    3.关于在Docker中部署的问题。

    我这个项目也是一个移植类的项目。既然要费心的移植,那目的当然是跑在linux系统上。。打包到docker 实现容器化部署

    所以。。

    但是我们的开发机又是windows系统。。

    所以我们需要在引用一下IBM.EntityFrameworkCore-Inx(PS:同时引用2个包不会有冲突)

    然后我们生成。。部署到docker。。

    你会发现。。项目跑起来了。。但是查询数据库。。又挂掉了。。

    错误信息如下:

    Unhandled Exception: System.DllNotFoundException: Unable to load DLL 'libdb2.so': The specified module could not be found.

    缺少依赖包,这个问题纠结了我一夜。。

    后来查询各种资料(查到凌晨。。MMP)发现,官方有一篇博客对这个问题进行了说明。但是解决方案我觉得并不是很合适,文章地址:点这里

    官方介绍是因为在docker环境中缺少了一个名为libxml2.so.2的依赖库

    我们需要自己下载这个库。。(百度搜索 )

    说一下为什么我觉得官方的解决方案不是很合适,以为他需要我们在main方法中加一段设置linux快捷访问的代码。

    其实我们完全可以把这段操作放在我们的DockerFile中。

    所以我们最终的DockerFile应该如下:

    FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
    WORKDIR /app
    COPY . /app
    EXPOSE 80
    COPY . ./
    COPY clidriver /app/clidriver
    COPY libs/libxml2.so.2.9.1 /app/clidriver/lib/libxml2.so.2.9.1
    RUN  ln /app/clidriver/lib/libxml2.so.2.9.1 /app/clidriver/lib/libxml2.so.2
    ENV LD_LIBRARY_PATH="/app/clidriver/lib/"
    ENV PATH=$PATH:"/app/clidriver/bin:/app/clidriver/lib"
    ENTRYPOINT ["dotnet", "DockerTest.dll"]

    然后查看我们的项目。。即可成功访问DB2数据库。~

    结束语

    说起来都是泪,国内关于EF Core访问 DB2的资料实在是太少太少了(ps:包括国外也不多。。)。。我都怀疑我是第一个吃螃蟹的人。。。

    写这篇博客 也是希望记录一下,下次可以在回来查看。备忘。。哈哈。。

  • 相关阅读:
    C. Shaass and Lights 解析(思維、組合)
    D. Binary String To Subsequences(队列)(贪心)
    CodeForces 1384B2. Koa and the Beach (Hard Version)(贪心)
    CodeForces 1384B1. Koa and the Beach (Easy Version)(搜索)
    CodeForces 1384C. String Transformation 1(贪心)(并查集)
    CodeForces 1384A. Common Prefixes
    POJ-2516 Minimum Cost(最小费用最大流)
    POJ3261-Milk Patterns(后缀数组)
    HDU-1300 Pearls(斜率DP)
    HDU-4528 小明系列故事-捉迷藏(BFS)
  • 原文地址:https://www.cnblogs.com/GuZhenYin/p/10790956.html
Copyright © 2011-2022 走看看