zoukankan      html  css  js  c++  java
  • 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这么垃圾,效率低下,啦啦啦~~~咱,不理你)

  • 相关阅读:
    Running ASP.NET Applications in Debian and Ubuntu using XSP and Mono
    .net extjs 封装
    ext direct spring
    install ubuntu tweak on ubuntu lts 10.04,this software is created by zhouding
    redis cookbook
    aptana eclipse plugin install on sts
    ubuntu open folderpath on terminal
    ubuntu install pae for the 32bit system 4g limited issue
    EXT Designer 正式版延长使用脚本
    用 Vagrant 快速建立開發環境
  • 原文地址:https://www.cnblogs.com/joeymary/p/6166052.html
Copyright © 2011-2022 走看看