Entity Framework - как получить тип данных столбца базы данных из метаданных - PullRequest
5 голосов
/ 28 сентября 2010

Есть ли способ получить информацию о длине столбца базы данных, учитывая EntityType таблицы?

Пример SQL (SQL Server), который вы можете запустить, чтобы точно узнать, какую информацию я ищу:

select 
    sys.tables.name as 'Table Name', 
    sys.columns.name as 'Column Name', 
    sys.systypes.name as 'DataType', 
    sys.columns.max_length as 'Max Length', 
    sys.columns.precision as 'Precision'
from 
    sys.columns, sys.systypes, sys.tables
where 
    sys.columns.system_type_id = sys.systypes.xtype 
    and sys.systypes.name <> 'sysname' 
    and sys.tables.type = 'U' 
    and sys.tables.name <> 'sysdiagrams'
    and sys.columns.object_id=sys.tables.object_id
order by 
    sys.tables.name, sys.columns.column_id;

Последние 3 столбца содержат данные, к которым я хотел бы получить доступ, потому что я генерирую некоторую документацию. Одной из примеров причин для документации является: Entity Framework по умолчанию генерирует исключение, если строка установлена ​​в свойстве, которое не может поддерживать ее длину. Разработчик, не имеющий доступа к метаданным базы данных, сталкивается с проблемой обнаружения требований к длине в этом случае.

Спасибо, Аарон

Ответы [ 3 ]

3 голосов
/ 29 сентября 2010

К сожалению, нет.

Даже если эта информация правильно записана в SSDL (т. Е. В языке определения схемы хранения), в EF нет открытого API для перехода от свойства C-Space (концептуальная модель) к столбцу S-Space (модель хранения).

Если ваша модель проста, вы можете вывести эту информацию, используя рабочее пространство метаданных EF и некоторую простую эвристику, но как только все станет немного сложнее, эта эвристика сломается.

На этом этапе вы можете только написать код для интерпретации файлов MSL (сопоставление или CS-Space) и использовать его вместе с MetadataWorkspace для перехода от C-Space к S-Space.

РЕДАКТИРОВАТЬ: как указано KristoferA у вас часто есть атрибут в свойстве C-Space, так что вы можете перейти непосредственно к этому. К сожалению, это не всегда так, и часто оно не синхронизируется с базой данных.

0 голосов
/ 21 февраля 2015

Да, это возможно: (EF6.1)

<Extension>
Public Function GetColumns(Of TEntity)(Db As IObjectContextAdapter) As List(Of DataColumn)
  Dim oMetadata As MetadataWorkspace
  Dim oObjects As ObjectItemCollection
  Dim oContext As ObjectContext
  Dim oColumn As DataColumn
  Dim oQuery As Func(Of EdmProperty, Boolean)
  Dim oType As EntityType

  GetColumns = New List(Of DataColumn)

  oContext = Db.ObjectContext
  oMetadata = oContext.MetadataWorkspace
  oObjects = oMetadata.GetItemCollection(DataSpace.OSpace)

  oType = oMetadata.GetItems(Of EntityType)(DataSpace.OSpace).
    Single(Function(EntityType As EntityType) oObjects.GetClrType(EntityType) Is GetType(TEntity))

  oQuery = Function(EdmProperty As EdmProperty) EdmProperty.DeclaringType.Name = oType.Name

  oType.Properties.ToList.ForEach(Sub(Column As EdmProperty)
                                    oColumn = New DataColumn With
                                              {
                                                .AutoIncrement = Column.IsStoreGeneratedIdentity,
                                                .AllowDBNull = Column.Nullable,
                                                .ColumnName = Column.Name,
                                                .DataType = Column.PrimitiveType.ClrEquivalentType,
                                                .Caption = Column.Name
                                              }

                                    If oColumn.DataType Is GetType(String) Then
                                      oColumn.MaxLength = Column.MaxLength.GetValueOrDefault
                                    Else
                                      oColumn.MaxLength = -1
                                    End If

                                    GetColumns.Add(oColumn)
                                  End Sub)
End Function
0 голосов
/ 07 августа 2013

Я почти уверен, что Книга Джулии Лерман описывает, как получить максимальную длину, по крайней мере, инструмент для ее проверки путем внесения изменений в создание POCO.Глава 13, начинается со страницы 356. Пример 13-12 описывает его, он начинается с

 string MaxLengthValidation(EdmProperty prop)...

это материал, защищенный авторским правом, поэтому я не буду вырезать / вставлять его, но я надеюсь, что вы можете купить его копиюзабронировать и получить информацию.

...