Entity framework 如何通过实体框架查询信息\u模式?

Entity framework 如何通过实体框架查询信息\u模式?,entity-framework,information-schema,Entity Framework,Information Schema,我正在开发一个应用程序,它使用元数据数据库信息进行分析,即查询信息和基于数据执行任务 为了简化数据操作,我在信息模式表/视图的顶部实现了代码优先的EF层。为什么先编码?因为我没有找到先通过db查询信息的方法。因此,我提出: [Table("INFORMATION_SCHEMA.SCHEMATA")] internal class Schema { #region Keys [Key, Column("CATALOG_NAME", Order = 0), MaxLength(256)]

我正在开发一个应用程序,它使用元数据数据库信息进行分析,即查询信息和基于数据执行任务

为了简化数据操作,我在信息模式表/视图的顶部实现了代码优先的EF层。为什么先编码?因为我没有找到先通过db查询信息的方法。因此,我提出:

[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出于安全原因阻止了对信息模式的查询?我用谷歌搜索了这个问题,但没有多大成功。 我看到的唯一备选方案是硬编码查询和松散的强类型数据:( 有人能帮忙吗? 提前感谢。

使用对我来说非常有效:

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");
  ....
}
内部类信息SchemaColumn
{
[列(“表格名称”)]
公共字符串表名{get;set;}
[列(“列名称”)]
公共字符串ColumnName{get;set;}
[列(“可为空”)]
公共字符串可为空{get;set;}
[列(“字符最大长度”)]
公共int字符最大长度{get;set;}
}
公共类MyContext:DbContext
{
....
public IQueryable AllInformationSchemaColumns=>AllInformationSchemaColumns.FromSql(“SELECT*FROM INFORMATION_SCHEMA.COLUMNS”);
....
}

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

首先,我了解到信息模式并不完全可靠(请参阅)。 我遇到了描述中缺少列的问题,这让我回到了sys模式

接下来,当您安装免费的SSMS(Management Studio)时,它附带了一组库,可以非常轻松地浏览模型的内容,并执行一些操作。这些是:

Microsoft.SqlServer.Smo

Microsoft.SqlServer.SmoExtended

自2017年以来,这些库还以nuget软件包的形式出现:


开发我的应用程序非常顺利,因为我使用了它,我只能推荐它。

使用视图可能是最好的解决方案,因为你只需要读取数据,服务器可以缓存它感谢建议。我了解了这一点,但应用程序不应该用其他db对象污染模型。我可以动态创建它们,然后使用后将其删除,但在应用程序崩溃时仍会保留,这是不需要的。