c# 开发orm框架

先编写一个Code frist

  • 可以通过代码的方式创建数据库

编写两个特性

using System;
public class NotNullAtter:System.Attribute{
    
}

///列别名
public class ColumAtter:System.Attribute{
    private string name;
    private string types;
    public ColumAtter(string val)
    {
        this.name=val;
    }
    public ColumAtter(string val,string types)
    {
        this.name = val;
        this.types=types;
    }
    public string getColumName(){
        return name;
    }
    public string getTypes(){
        return types;
    }
}

------------
public class TableAttr : System.Attribute{

    private string TableName;
    public TableAttr(string val)
    {
        this.TableName=val;
    }
    public string getName(){
       return this.TableName;
    }
}

编写完特性之后我们还需要编写一个类加载器

using System.Text;
using System.IO;
using System.Reflection;
using System;
using System.Collections.Generic;
using System.Linq;

public abstract class ClassLoader {

    public StringBuilder builderSql=new StringBuilder();
    public ClassLoader(HashSet<Type> types,String baseName,String conn)
    {           
        SqlConFactory.SetConnection(conn);
        
     builderSql.Append($"create database {baseName};");
        builderSql.Append($" use {baseName};");
        
        
        foreach(Type t in types){    
            BuildTable(t);
        }
    }
    public void BuildTable(Type t){
        string tableName=GetTableName(Attribute.GetCustomAttributes(t));
        if(tableName=="")return;
        builderSql.Append($" create table {tableName} ");
        builderSql.Append("(");
        FieldInfo[] fields= t.GetFields();
        foreach(FieldInfo info in fields){ 
            
           (bool IsNull,string columName,string types) r= IsNullAndGetval(info);
           
           builderSql.Append($"{r.columName} {r.types}");
           
           if(!r.IsNull)builderSql.Append($" not null");
            builderSql.Append(",");
        }
        builderSql.Remove(builderSql.Length-1,1);
        
        builderSql.Append(")");
        builderSql.Append("ENGINE=InnoDB DEFAULT CHARSET=utf8;");

    }
   public void Build(){
       MysqlHerper herper=new MysqlHerper();
       
       System.Console.WriteLine(builderSql.ToString());
       herper.Exquery(builderSql.ToString());
       System.Console.WriteLine("执行完毕!!!");
   }
    public (bool IsNull,string columName,string types) IsNullAndGetval(FieldInfo t){
        (bool IsNull,string columName,string types) res=(false,"","");
        if (t.GetCustomAttribute(typeof(NotNullAtter))!=null)
            res.IsNull=false;
        
        ColumAtter Colatter= (ColumAtter)t.GetCustomAttribute(typeof(ColumAtter));
        
        res.columName=Colatter.getColumName();
        
        res.types=Colatter.getTypes();
        return res;
    }
    

    public string GetTableName(System.Attribute[] attributes){
        foreach(Attribute atter in attributes){
            if(atter is TableAttr){
                return ((TableAttr)atter).getName();
            }
        }
        return "";
    }
}
using System;
using MySql.Data.MySqlClient;
public class MysqlHerper{

    
    public bool Exquery(String sql){
        using(MySqlConnection connection=SqlConFactory.GetConnection()){
            using(MySqlCommand cmd=connection.CreateCommand()){
                connection.Open();
                cmd.CommandText=sql;
                return cmd.ExecuteNonQuery()>0;
            }
        }
    }
}

using System;
using MySql.Data.MySqlClient;
public class SqlConFactory{
    private static string connstr="";
 
    private static MySqlConnection _Conn=new MySqlConnection(connstr);
   
    //修改用户链接
    public static void SetConnection(String connstr){
        _Conn=new MySqlConnection(connstr);
        _Conn.Open();
    }
    //获得一个链接
    public static MySqlConnection GetConnection(){
        return (MySqlConnection)_Conn.Clone();
    }
}
  • 到现在我们就实现了简单的code first
  • 建立一个控制台项目,引入orm这个项目
using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    public class CreatBase : ClassLoader
    {
        public CreatBase(HashSet<Type> path, string baseName,String conn) : base(path, baseName, conn)
        {
            
            
        }
    }
}


using System;

namespace ConsoleApp1
{
    [TableAttr("TestTables")]
    public class TestTable
    {
        
        [ColumAtter("TestName","varchar(255)")]
        public String Name;
    
        [ColumAtter("age","int")]
        public int age;

    }
}

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            
            HashSet<Type> hashSet=new HashSet<Type>();
            hashSet.Add(typeof(TestTable));
            CreatBase obj=new CreatBase(hashSet,"ormTest","server=127.0.0.1;port=3306;user=root;password=yh123; database=mysql;");
            obj.Build();
        }
    }
}

运行一下 我们就可以看到数据库已经建立ormtest

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值