You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel.SQL/SqlServerEntities/TableInfo.cs

176 lines
4.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
namespace ZeroLevel.SqlServer
{
public abstract class TableInfo : IEquatable<TableInfo>
{
#region Private fields
/// <summary>
/// Имя таблицы
/// </summary>
protected readonly string _name;
/// <summary>
/// Поле-идентификатор
/// </summary>
private ColumnInfo _primaryKey;
/// <summary>
/// Все поля таблицы
/// </summary>
private readonly Dictionary<string, ColumnInfo> _columns = new Dictionary<string, ColumnInfo>();
/// <summary>
/// Индексы
/// </summary>
private readonly List<IndexInfo> _indexes = new List<IndexInfo>();
#endregion
#region Properties
public ColumnInfo this[string columnName]
{
get
{
if (_columns.ContainsKey(columnName))
{
return _columns[columnName];
}
return null;
}
}
/// <summary>
/// Первичный ключ
/// </summary>
public ColumnInfo PrimaryKey
{
get { return _primaryKey; }
}
/// <summary>
/// Имя таблицы
/// </summary>
public string Name
{
get
{
return _name;
}
}
/// <summary>
/// Индексы
/// </summary>
public List<IndexInfo> Indexes
{
get
{
return _indexes;
}
}
/// <summary>
/// Поля таблицы
/// </summary>
public IEnumerable<ColumnInfo> Columns
{
get
{
return _columns.Values;
}
}
#endregion
#region Ctor
/// <summary>
/// Конструктор по-умолчанию
/// </summary>
/// <param name="name"></param>
public TableInfo(string name)
{
_name = name;
}
/// <summary>
/// Конструктор по-умолчанию
/// </summary>
/// <param name="name"></param>
public TableInfo(TableInfo other)
{
_name = other._name;
_columns = new Dictionary<string, ColumnInfo>(other._columns);
_indexes = new List<IndexInfo>(other._indexes);
_primaryKey = other._primaryKey;
}
#endregion
#region IEquatable
public override bool Equals(object obj)
{
return this.Equals(obj as TableInfo);
}
/// <summary>
/// Сравнение с другой таблицей
/// </summary>
public bool Equals(TableInfo other)
{
if (other == null || _name.Equals(other._name, StringComparison.OrdinalIgnoreCase) == false)
return false;
if (false == Columns.NoOrderingEquals(other.Columns))
{
return false;
}
return true;
}
#endregion
#region Abstract
protected abstract IEnumerable<IndexInfo> GetIndexes(IDbProvider db);
protected abstract IEnumerable<ColumnInfo> GetColumns(IDbProvider db);
#endregion
#region Fill table info
public void AppendNewColumn(ColumnInfo column)
{
_columns.Add(column.Name, column);
if (column.IsPrimaryKey)
_primaryKey = column;
}
/// <summary>
/// Заполнение данных о таблице
/// </summary>
/// <param name="db">Подключение к базе данных</param>
public void FillTableInfo(IDbProvider db)
{
foreach (var column in GetColumns(db))
{
_columns.Add(column.Name, column);
if (column.IsPrimaryKey)
{
_primaryKey = column;
}
}
foreach (var index in GetIndexes(db))
{
_indexes.Add(index);
}
}
#endregion
/// <summary>
/// Проверка наличия поля
/// </summary>
public bool ContainsColumns(ColumnInfo column)
{
return Columns.Any(r => r.Equals(column));
}
/// <summary>
/// Проверка наличия поля
/// </summary>
public bool ContainsColumns(string columnName)
{
return Columns.Any(r => r.Name.Equals(columnName, StringComparison.OrdinalIgnoreCase));
}
public override int GetHashCode()
{
return _name.GetHashCode();
}
}
}

Powered by TurnKey Linux.