• EFcodeFirst+T4=操纵任意数据库


      之前有写过两篇,EF选择Mysql数据源 跟 EF添加ADO.NET实体模型处直接选择Oracle数据源,其方便之处就不多说了,使用DBfirst直接点点点就能与数据库双向更新,而且关键是方便我们使用T4,如:

    (如果你对T4有个大概认识,只会通过ADO.NET实体模型进行集合遍历,那么可以继续看下去)

      但是现在如果要使用其他数据库,却又苦于找不到像前两者一样的For VS驱动安装(这里表扬下MySQL跟Oracle,良心产品,对我.NET还是很友好的),那么就只能使用codefirst进行EF连接了,但是这样一来,我们不仅多出手动创建一堆Model等的麻烦,而且,关键的我们用于T4的.edmx文件就没了,这可咋整,T4中如何遍历???

      解决办法,我一开始觉得有好几种,无非弄出一个集合来,一开始我想的是通过建个.cs,每个属性名跟Table名一致,去遍历属性,得到Table名集合。遗憾的是我TM怎么也获取不到属性!!!

    <#@ template debug="false" hostspecific="true" language="C#" #>
    <#@ include file="EF.Utility.CS.ttinclude"#>
    <#@ assembly name="E:编程C#T4TestT4TestinDebugModel.dll" #>
    <#@ output extension=".cs" #>
    <#//var ItemCollection = typeof(Assembly).GetProperties();
                //var ItemCollection = typeof(Model.ModelTest).GetProperties();
                
                //var ItemCollection = Assembly.Load("T4Test").ExportedTypes.Where(c=>c.FullName == "T4Test.T").FirstOrDefault().GetProperties();
    #>

      然后用了一个挫办法,直接文件读取,创建一个.txt文件,逗号分隔多个表名。

      注意:最后一个逗号不要忽略(这是我代码问题,懒得改)

    对应的T4:

        

    <#@ template debug="false" hostspecific="true" language="C#" #>
    <#@ include file="EF.Utility.CS.ttinclude"#>
    <#@ output extension=".cs" #>
    <#
                
    
    
                string[] ItemCollection = new string[] { "" };
                using (StreamReader reader = new StreamReader(@"E:编程C#T4TestT4Test	xtFile.txt"))//注意这里的文件路径是你硬盘的真实路径,除非你将该txt文件放到T4生成器一致的目录下。也很好理解吧?!
                {
                    string nameStr = reader.ReadToEnd();
                    int index = nameStr.LastIndexOf(',');
                    nameStr = nameStr.Substring(0, index);
                    ItemCollection = nameStr.Split(',');
                }        
    #>
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace GISER.TMH.IDAL
    {
    
    <#
    
    foreach(var entity in ItemCollection)
    {
    
    #>
        public partial interface I<#=entity#>Dal
        {
            //公共的方法封装到了基接口中
            //存放IDal特有的一些方法
            //要使用独有的方法,新建该类的partial类或接口来创建,不要在这里创建,容易被更改T4模板后覆盖掉
        }
    
    <#}#>
    
    }

      下面以PostgreSQL为例

      1、新建类库,Nuget下载Npgsql驱动。2.27

      

      2、类库中新建ADO.NET实体模型,选择空Codefirst

    打开配置文件,标记2是Nuget驱动的时候自动加上的,标记1需要手动添加,标记3就是你的数据库连接字符串,不多说。

      

      3、打开你的DbContext类,新建你的实体类跟对应的Dbset属性。注意的是红色框选的,改变table对应的“命名空间”,不修改的话,EF生成的sql表名实际上会是dbo.table1,于是就提示table1不存在,很尴尬。熟悉Pg的朋友肯定对public.table1熟悉吧,没错,改成public即可,具体看图。

      4、新建个控制台程序或web客户端,同样要Nuget Pgsql EF2.2.7,跟上面一样,然后配置也一样要修改,重新生成。

    测试:

      

    目前位置,T4跟Pg的Codefirst都通了,喜欢跟我一样用三层的同学,只需要用T4生成所有的partial类。一切又干净而方便了。

    但这里有时候经常改动数据库的话,一个个T4按保存还是好麻烦,有朋友有解决办法请留言哦

    就是喜欢用EF,即使指定用Dapper,我也改成EF的使用方式。0 0.(这里有同学可能要说EF这么垃圾,效率低下,啦啦啦~~~咱,不理你)

  • 相关阅读:
    子序列自动机学习笔记
    P4709 信息传递 解题报告
    斯坦纳树学习笔记
    NOIP2021 游记
    P5206 [WC2019]数树 解题报告
    CF1205D Almost All 解题报告
    设计模式原来如此策略模式(Strategy Pattern)
    再次站起,继续开博
    Java原来如此反射机制
    Java原来如此随机数
  • 原文地址:https://www.cnblogs.com/joeymary/p/6166052.html
Copyright © 2020-2023  润新知