Я хотел бы инкапсулировать setTimeOut в согласованности с обещаниями для других асинхронных задач: Демо в Fiddle
function sleep(ms)
{
return(new Promise(function(resolve, reject) {
setTimeout(function() { resolve(); }, ms);
}));
}
Используется как:
sleep(2000).then(function() {
// Do something
});
Легко запомнить синтаксис, если вы использовали Promises.
Вы можете получить эту информацию из метаданных Entity Framework:
var metadata = ((IObjectContextAdapter)db).ObjectContext.MetadataWorkspace;
var tables = metadata.GetItemCollection(DataSpace.SSpace)
.GetItems<EntityContainer>().Single()
.BaseEntitySets
.OfType<EntitySet>()
.Where(s => !s.MetadataProperties.Contains("Type") || s.MetadataProperties["Type"].ToString() == "Tables");
foreach (var table in tables)
{
Console.WriteLine(string.Format("{0}.{1}", table.Schema, table.Name));
foreach (var member in table.ElementType.Members)
{
var column = string.Format(" {0}, Nullable: {1}",
member.Name,
((TypeUsage)member.MetadataProperties["TypeUsage"].Value).Facets["Nullable"].Value);
Console.WriteLine(column);
}
}
(где db
- DbContext
)
Это даст вам результат, например :
dbo.Category
CategoryId, Nullable: False
CategoryName, Nullable: False
Description, Nullable: True
RowVersion, Nullable: False
dbo.Product
ProductId, Nullable: False
ProductName, Nullable: False
QuantityPerUnit, Nullable: False
UnitPrice, Nullable: True
StartDate, Nullable: False
RowVersion, Nullable: False
Image, Nullable: True
dbo.CategoryProduct
CategoryID, Nullable: False
ProductID, Nullable: False
Я заимствовал первую часть из Роуэна Миллера .
Я не уверен, что это лучший подход, но я создал метод расширения для класса DbContext
, который принимает строковое имя таблицы данных и затем запрашивает таблицы sys
для этой метаинформации. В частности, я создал следующие 2 класса и метод расширения.
TableSchema
Это класс высокого уровня, используемый для хранения соответствующих деталей схемы:
public class TableSchema
{
public string Database { get; internal set; }
public string TableName { get; internal set; }
public List<ColumnSchema> Columns { get; internal set; }
}
ColumnSchema
Как и TableSchema, это класс, который будет содержать все связанные с схемой детали для каждого столбца.
public class ColumnSchema
{
public string ColumnName { get; internal set; }
public int ColumnPosition { get; internal set; }
public string Collation { get; internal set; }
public string TypeName { get; internal set; }
public short Size { get; internal set; }
public byte Precision { get; internal set; }
public byte Scale { get; internal set; }
internal int _PK { get; set; }
public bool IsIdentity { get; internal set; }
public bool IsNullable { get; internal set; }
public bool IsPrimaryKey
{
get { return _PK == 1; }
}
}
Метод расширения (GetDbTableSchema)
Этот метод расширяет класс DbContext
. Это позволяет получить информацию о базовых таблицах так же просто, как передать имя в метод, сразу после вашего контекста.
public static class DbContextExtensions
{
public static TableSchema GetDbTableSchema(this DbContext ctx, string tableName)
{
string qry = string.Format(
@"SELECT * FROM (SELECT DISTINCT
c.name AS ColumnName,
c.column_id AS ColumnPosition,
ty.name AS TypeName,
c.max_length AS Size,
c.precision AS Precision,
c.scale AS Scale,
CASE WHEN ic.column_id IS NOT NULL THEN 1 ELSE 0 END AS [_PK],
c.is_identity AS [IsIdentity],
c.is_nullable AS [IsNullable]
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
INNER JOIN sys.types ty ON c.system_type_id = ty.system_type_id
LEFT OUTER JOIN sys.indexes i ON c.object_id = i.object_id AND i.is_primary_key = 1
LEFT OUTER JOIN sys.index_columns ic ON i.object_id = ic.object_id
AND i.index_id = ic.index_id
AND c.column_id = ic.column_id
WHERE t.name = '{0}') t
ORDER BY _PK DESC, ColumnPosition", tableName);", tableName);
return new TableSchema
{
Columns = ctx.Database.SqlQuery<ColumnSchema>(qry).ToList(),
Database = ctx.Database.Connection.Database,
TableName = tableName
};
}
}
Использование очень простое. Предполагая, что у вас есть имя таблицы данных, передайте его в свой контекст.
using (var ctx = new MyEntityContext()
{
TableSchema ts = ctx.GetDbTableSchema("MyTable");
foreach (ColumnSchema cs in ts.Columns)
{
Debug.WriteLine("Column: {0}, {1}", cs.ColumnName, cs.IsNullable ? "NULL" : "NOT NULL");
}
}