先编写一个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