实体框架 - 如何从元数据中获取数据库列数据类型

sos*_*slo 5 sql-server types entity-framework metadata

有没有办法在给定表的EntityType的情况下获取数据库列DataType长度信息?

您可以运行示例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;
Run Code Online (Sandbox Code Playgroud)

最后3列包含我想要访问的数据,因为我正在生成一些文档.文档的一个示例原因是:如果在不支持其长度的属性上设置字符串,则实体框架将默认抛出异常.在这种情况下,无法访问数据库元数据的开发人员对长度要求的可发现性提出了挑战.

谢谢你,亚伦

Ale*_*mes 3

很不幸的是,不行。

即使在 SSDL(即存储架构定义语言)中正确捕获该信息,EF 中也没有公共 API 可以从C-Space(概念模型)属性转到S-Space(存储模型)列。

如果您的模型很简单,您也许可以使用 EF 元数据工作区和一些简单的启发法来推断该信息,但一旦事情变得稍微复杂,这些启发法就会崩溃。

此时您唯一的选择是编写代码来解释 MSL(映射或)文件,并将其与to go from toCS-Space结合使用。MetadataWorkspaceC-SpaceS-Space

编辑:正如KristoferA所指出的,您经常在 C-Space 属性上拥有该属性,因此您可以直接转到该属性。不幸的是,情况并非总是如此,并且常常与数据库不同步。