123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- 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()&&entityInfo.IsDisabledUpdateAll==false)
- {
- if (entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1)
- {
- AddColumn(entityInfo);
- return;
- }
- var tableName = GetTableName(entityInfo);
- var dbColumns = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName,false);
- 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)
- {
- //only support .net core
- if (this.Context.CurrentConnectionConfig?.MoreSettings?.SqliteCodeFirstEnableDropColumn == true)
- {
- 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);
- }
- }
- }
- private void AddColumn(EntityInfo entityInfo)
- {
- var tableName2 = GetTableName(entityInfo);
- var dbColumns2 = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName2, false);
- var entityColumns2 = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList();
- ConvertColumns(dbColumns2);
- var addColumns2 = entityColumns2
- .Where(ec => ec.OldDbColumnName.IsNullOrEmpty() || !dbColumns2.Any(dc => dc.DbColumnName.Equals(ec.OldDbColumnName, StringComparison.CurrentCultureIgnoreCase)))
- .Where(ec => !dbColumns2.Any(dc => ec.DbColumnName.Equals(dc.DbColumnName, StringComparison.CurrentCultureIgnoreCase))).ToList();
- foreach (var item in addColumns2)
- {
- if (item.IsPrimarykey || item.IsIdentity)
- {
- Check.ExceptionEasy("Multiple primary keys cannot be modified", "多主键不能修改");
- }
- this.Context.DbMaintenance.AddColumn(tableName2, EntityColumnToDbColumn(entityInfo, tableName2, item));
- }
- }
- 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);
- }
- if (entityInfo.IsCreateTableFiledSort)
- {
- columns = columns.OrderBy(c => c.CreateTableFieldSort).ToList();
- columns = columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).ToList();
- }
- }
- 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,
- CreateTableFieldSort = item.CreateTableFieldSort
- };
- 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);
- }
- }
- }
|