如何通过Entity Framework查询INFORMATION_SCHEMA?

时间:2018-04-16 12:43:51

标签: entity-framework information-schema

我正在开发一个使用元数据数据库信息进行分析的应用程序,即查询INFORMATION_SCHEMA并根据数据执行任务。

为了简化数据操作,我在INFORMATION_SCHEMA表/视图之上实现了代码优先的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的查询?我搜索了这个问题但没有取得多大成功。 我看到的唯一替代选项是硬编码查询和松散的强类型数据。 :( 有人可以帮忙吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

使用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 => InformationSchemaColumns.FromSql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS");
  ....
}

答案 1 :(得分:0)

这不是问题的确切答案,而是解决问题的最佳方法:

首先,我了解到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

自从我使用它以来,我的应用程序开发就非常顺利,我只能推荐它。