如何通过Entity Framework查询INFORMATION_SCHEMA?
How can I query INFORMATION_SCHEMA through Entity Framework?
我正在开发一个使用元数据数据库信息进行分析的应用程序,即查询 INFORMATION_SCHEMA 并根据数据执行任务。
为了简化数据操作,我在 INFORMATION_SCHEMA tables/views 之上实现了代码优先 EF 层。为什么要先编码?因为我没有找到先通过 db 查询 INFORMATION_SCHEMA 模式的方法。所以我来了:
[Table("INFORMATION_SCHEMA.SCHEMATA")]
internal class Schema
{
#region Keys
[Key, Column("CATALOG_NAME", Order = 0), MaxLength(256)]
public string Catalog { get; set; }
[Key, Column("SCHEMA_NAME", Order = 1), MaxLength(256)]
public string Name { get; set; }
#endregion Keys
[Column("DEFAULT_CHARACTER_SET_CATALOG")]
public string DefaultCharacterSetforCatalog { get; set; }
[Column("DEFAULT_CHARACTER_SET_SCHEMA")]
public string DefaultCharacterSetforSchema { get; set; }
[Column("DEFAULT_CHARACTER_SET_NAME")]
public string DefaultCharacterSetName { get; set; }
[Column("SCHEMA_OWNER")]
public string Owner { get; set; }
}
我的问题是,当我尝试使用
读取数据时
_informationSchema.Schemas.Load();
我收到消息
System.Data.SqlClient.SqlException: The specified schema name "INFORMATION_SCHEMA" either does not exist or you do not have permission to use it.
据我所知,这个模式是存在的。而且我可以用SSMS查询,所以不是授权的问题。我认为出于安全原因,也许 EF 正在阻止对 INFORMATION_SCHEMA 的查询?我用谷歌搜索了这个问题但没有成功。
我看到的唯一替代选择是硬编码查询和松散强类型数据。 :(
有人可以帮忙吗?
提前致谢。
使用 FromSql 对我来说效果很好:
internal class InformationSchemaColumn
{
[Column("TABLE_NAME")]
public string TableName { get; set; }
[Column("COLUMN_NAME")]
public string ColumnName { get; set; }
[Column("IS_NULLABLE")]
public string IsNullable { get; set; }
[Column("CHARACTER_MAXIMUM_LENGTH")]
public int CharacterMaximumLength { get; set; }
}
public class MyContext : DbContext
{
....
public IQueryable<InformationSchemaColumn> AllInformationSchemaColumns => AllInformationSchemaColumns.FromSql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS");
....
}
这不是问题的确切答案,而是解决问题的最佳方法:
首先,我读到 INFORMATION_SCHEMA 并不完全可靠(参见 The case against INFORMATION_SCHEMA views)。
我遇到了描述中缺少列的问题,这让我回到了 sys 模式。
接下来,当您安装免费的 SSMS (Management Studio) 时,它附带了一组库,使您可以非常轻松地浏览模型的内容,并在事件中执行一些操作。它们是:
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SmoExtended
自 2017 年以来,这些库也作为 nuget 包提供:
https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/installing-smo?view=sql-server-2017
自从我用了这个之后,开发我的应用程序非常顺利,我只能推荐它。
我遇到了同样的情况,我想分享一下我是如何解决这个问题的,这很简单。
我唯一做的就是一个视图。
CREATE VIEW [dbo].[ViewSystemColums]
AS
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
然后我就直接映射到Entity Framework里面去查询信息了
我正在开发一个使用元数据数据库信息进行分析的应用程序,即查询 INFORMATION_SCHEMA 并根据数据执行任务。
为了简化数据操作,我在 INFORMATION_SCHEMA tables/views 之上实现了代码优先 EF 层。为什么要先编码?因为我没有找到先通过 db 查询 INFORMATION_SCHEMA 模式的方法。所以我来了:
[Table("INFORMATION_SCHEMA.SCHEMATA")]
internal class Schema
{
#region Keys
[Key, Column("CATALOG_NAME", Order = 0), MaxLength(256)]
public string Catalog { get; set; }
[Key, Column("SCHEMA_NAME", Order = 1), MaxLength(256)]
public string Name { get; set; }
#endregion Keys
[Column("DEFAULT_CHARACTER_SET_CATALOG")]
public string DefaultCharacterSetforCatalog { get; set; }
[Column("DEFAULT_CHARACTER_SET_SCHEMA")]
public string DefaultCharacterSetforSchema { get; set; }
[Column("DEFAULT_CHARACTER_SET_NAME")]
public string DefaultCharacterSetName { get; set; }
[Column("SCHEMA_OWNER")]
public string Owner { get; set; }
}
我的问题是,当我尝试使用
读取数据时 _informationSchema.Schemas.Load();
我收到消息
System.Data.SqlClient.SqlException: The specified schema name "INFORMATION_SCHEMA" either does not exist or you do not have permission to use it.
据我所知,这个模式是存在的。而且我可以用SSMS查询,所以不是授权的问题。我认为出于安全原因,也许 EF 正在阻止对 INFORMATION_SCHEMA 的查询?我用谷歌搜索了这个问题但没有成功。 我看到的唯一替代选择是硬编码查询和松散强类型数据。 :( 有人可以帮忙吗? 提前致谢。
使用 FromSql 对我来说效果很好:
internal class InformationSchemaColumn
{
[Column("TABLE_NAME")]
public string TableName { get; set; }
[Column("COLUMN_NAME")]
public string ColumnName { get; set; }
[Column("IS_NULLABLE")]
public string IsNullable { get; set; }
[Column("CHARACTER_MAXIMUM_LENGTH")]
public int CharacterMaximumLength { get; set; }
}
public class MyContext : DbContext
{
....
public IQueryable<InformationSchemaColumn> AllInformationSchemaColumns => AllInformationSchemaColumns.FromSql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS");
....
}
这不是问题的确切答案,而是解决问题的最佳方法:
首先,我读到 INFORMATION_SCHEMA 并不完全可靠(参见 The case against INFORMATION_SCHEMA views)。 我遇到了描述中缺少列的问题,这让我回到了 sys 模式。
接下来,当您安装免费的 SSMS (Management Studio) 时,它附带了一组库,使您可以非常轻松地浏览模型的内容,并在事件中执行一些操作。它们是:
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SmoExtended
自 2017 年以来,这些库也作为 nuget 包提供: https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/installing-smo?view=sql-server-2017
自从我用了这个之后,开发我的应用程序非常顺利,我只能推荐它。
我遇到了同样的情况,我想分享一下我是如何解决这个问题的,这很简单。
我唯一做的就是一个视图。
CREATE VIEW [dbo].[ViewSystemColums]
AS
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
然后我就直接映射到Entity Framework里面去查询信息了