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:包括国外也不多。。)。。我都怀疑我是第一个吃螃蟹的人。。。

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

  • 相关阅读:
    UNIX网络编程读书笔记:辅助数据
    使用Android Studio搭建Android集成开发环境(图文教程)
    Android数据存储(二)----PreferenceFragment详解
    Android系列----JUnit单元测试的使用
    Android数据存储(一)----SharedPreferences详解
    使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)
    Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
    Android系列之网络(二)----HTTP请求头与响应头
    Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
    Android多线程----异步消息处理机制之Handler详解
  • 原文地址:https://www.cnblogs.com/GuZhenYin/p/10790956.html
Copyright © 2011-2022 走看看