150 lines
7.6 KiB
C#
150 lines
7.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace SqlSugar
|
|
{
|
|
public class SqliteCodeFirst : CodeFirstProvider
|
|
{
|
|
public override void ExistLogic(EntityInfo entityInfo)
|
|
{
|
|
if (entityInfo.Columns.HasValue())
|
|
{
|
|
Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1");
|
|
|
|
var tableName = GetTableName(entityInfo);
|
|
var dbColumns = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName);
|
|
ConvertColumns(dbColumns);
|
|
var entityColumns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList();
|
|
var dropColumns = dbColumns
|
|
.Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
|
|
.Where(dc => !entityColumns.Any(ec => dc.DbColumnName.Equals(ec.DbColumnName, StringComparison.CurrentCultureIgnoreCase)))
|
|
.ToList();
|
|
var addColumns = entityColumns
|
|
.Where(ec => ec.OldDbColumnName.IsNullOrEmpty() || !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
|
|
.Where(ec => !dbColumns.Any(dc => ec.DbColumnName.Equals(dc.DbColumnName, StringComparison.CurrentCultureIgnoreCase))).ToList();
|
|
//var alterColumns = entityColumns
|
|
// .Where(ec => !dbColumns.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
|
|
// .Where(ec =>
|
|
// dbColumns.Any(dc => dc.DbColumnName.Equals(ec.DbColumnName)
|
|
// && ((!UtilMethods.GetUnderType(ec.PropertyInfo).IsEnum() && UtilMethods.GetUnderType(ec.PropertyInfo).IsIn(UtilConstants.StringType)) ||
|
|
|
|
// IsSamgeType(ec, dc)))).ToList();
|
|
var renameColumns = entityColumns
|
|
.Where(it => !string.IsNullOrEmpty(it.OldDbColumnName))
|
|
.Where(entityColumn => dbColumns.Any(dbColumn => entityColumn.OldDbColumnName.Equals(dbColumn.DbColumnName, StringComparison.CurrentCultureIgnoreCase)))
|
|
.ToList();
|
|
|
|
|
|
var isChange = false;
|
|
foreach (var item in addColumns)
|
|
{
|
|
this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
|
|
isChange = true;
|
|
}
|
|
foreach (var item in dropColumns)
|
|
{
|
|
//this.Context.DbMaintenance.DropColumn(tableName, item.DbColumnName);
|
|
//isChange = true;
|
|
}
|
|
//foreach (var item in alterColumns)
|
|
//{
|
|
// //this.Context.DbMaintenance.AddColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
|
|
// //isChange = true;
|
|
//}
|
|
foreach (var item in renameColumns)
|
|
{
|
|
throw new NotSupportedException("rename Column");
|
|
}
|
|
|
|
foreach (var item in entityColumns)
|
|
{
|
|
var dbColumn = dbColumns.FirstOrDefault(dc => dc.DbColumnName.Equals(item.DbColumnName, StringComparison.CurrentCultureIgnoreCase));
|
|
if (dbColumn == null) continue;
|
|
bool pkDiff, idEntityDiff;
|
|
KeyAction(item, dbColumn, out pkDiff, out idEntityDiff);
|
|
if (dbColumn != null && pkDiff && !idEntityDiff)
|
|
{
|
|
var isAdd = item.IsPrimarykey;
|
|
if (isAdd)
|
|
{
|
|
this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
|
|
}
|
|
else
|
|
{
|
|
this.Context.DbMaintenance.DropConstraint(tableName, string.Format("PK_{0}_{1}", tableName, item.DbColumnName));
|
|
}
|
|
}
|
|
else if (pkDiff || idEntityDiff)
|
|
{
|
|
ChangeKey(entityInfo, tableName, item);
|
|
}
|
|
}
|
|
if (isChange && base.IsBackupTable)
|
|
{
|
|
this.Context.DbMaintenance.BackupTable(tableName, tableName + DateTime.Now.ToString("yyyyMMddHHmmss"), MaxBackupDataRows);
|
|
}
|
|
}
|
|
}
|
|
public override void NoExistLogic(EntityInfo entityInfo)
|
|
{
|
|
var tableName = GetTableName(entityInfo);
|
|
string backupName=tableName+DateTime.Now.ToString("yyyyMMddHHmmss");
|
|
Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1");
|
|
List<DbColumnInfo> columns = new List<DbColumnInfo>();
|
|
if (entityInfo.Columns.HasValue())
|
|
{
|
|
foreach (var item in entityInfo.Columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).Where(it=>it.IsIgnore==false))
|
|
{
|
|
DbColumnInfo dbColumnInfo = this.EntityColumnToDbColumn(entityInfo, tableName, item);
|
|
columns.Add(dbColumnInfo);
|
|
}
|
|
}
|
|
this.Context.DbMaintenance.CreateTable(tableName, columns,true);
|
|
}
|
|
protected override DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
|
|
{
|
|
var propertyType = UtilMethods.GetUnderType(item.PropertyInfo);
|
|
var result = new DbColumnInfo()
|
|
{
|
|
TableId = entityInfo.Columns.IndexOf(item),
|
|
DbColumnName = item.DbColumnName.HasValue() ? item.DbColumnName : item.PropertyName,
|
|
IsPrimarykey = item.IsPrimarykey,
|
|
IsIdentity = item.IsIdentity,
|
|
TableName = tableName,
|
|
IsNullable = item.IsNullable,
|
|
DefaultValue = item.DefaultValue,
|
|
ColumnDescription = item.ColumnDescription,
|
|
Length = item.Length
|
|
};
|
|
GetDbType(item, propertyType, result);
|
|
if (result.DataType.Equals("varchar", StringComparison.CurrentCultureIgnoreCase) && result.Length == 0)
|
|
{
|
|
result.Length = 1;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
protected override void ConvertColumns(List<DbColumnInfo> dbColumns)
|
|
{
|
|
foreach (var item in dbColumns)
|
|
{
|
|
if (item.DataType == "DateTime")
|
|
{
|
|
item.Length = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void ChangeKey(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
|
|
{
|
|
this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
|
|
if (!item.IsPrimarykey)
|
|
this.Context.DbMaintenance.DropConstraint(tableName,null);
|
|
if (item.IsPrimarykey)
|
|
this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
|
|
}
|
|
}
|
|
}
|