Я не уверен, что это лучший подход, но я создал метод расширения для класса 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");
}
}
Если это имеет значение, от источник jQuery :
jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
"change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
// Handle event binding
jQuery.fn[name] = function(fn){
return fn ? this.bind(name, fn) : this.trigger(name);
};
});
Так не, нет никакого различия -
$().click(fn)
вызовы
$().bind('click',fn)
+1 для ответа Matthew, но я думал, что должен упомянуть, что можно также связать больше чем один обработчик событий сразу с помощью bind
$('#myDiv').bind('mouseover focus', function() {
$(this).addClass('focus')
});
, который является намного более чистым эквивалентом:
var myFunc = function() {
$(this).addClass('focus');
};
$('#myDiv')
.mouseover(myFunc)
.focus(myFunc)
;
Существует одно различие, в котором можно связать пользовательские события с помощью второй формы, которую Вы имеете. Иначе они, кажется, синонимичны. См.: Документы События jQuery
There is the [data] parameter of bind which will occur only at bind-time, once.
You can also specify custom events as the first parameter of bind.
Если у вас есть Google Chrome, его инструменты разработчика имеют инструмент прослушивания событий, выберите элемент, который вы хотите отслеживать его событие.
Вы обнаружите, что использование обоих способов приводит к одному и тому же результату, поэтому они эквивалентны.