【问题标题】:Querying database schema with LINQ to SQL [duplicate]使用 LINQ to SQL 查询数据库架构 [重复]
【发布时间】:2013-09-03 10:14:50
【问题描述】:

我正在尝试编写一个应用程序,它可以指向不同的数据库并查看数据库的架构,即表及其列的属性、关系、约束等。我一直在研究LINQ to SQL方法 GetTable(),但这似乎没有返回任何内容;

public static IEnumerable<MetaTable> GetMetaTables()
{
    using (var connection = new SqlConnection(ConnectionString))
    using (var context = new SchemaDataContext(connection))
           return context.Mapping.GetTables().ToList();
}

我做错了什么!?

【问题讨论】:

  • 您是否真的在 SchemaDataContext 中创建了实体?
  • 不!我想这就是这里的问题,我需要一种查询所有表而不考虑实体的方法。

标签: c# linq linq-to-sql


【解决方案1】:

var model = new AttributeMappingSource().GetModel(typeof({YourDataContext})); return model.GetTables().ToList();


编辑到我原来​​的解决方案:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    DataTable table = connection.GetSchema("Tables");

    // displaying data:
    foreach (System.Data.DataRow row in table.Rows)
    {
        foreach (System.Data.DataColumn col in table.Columns)
        {
           Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
        }
}

【讨论】:

  • 如果您已经拥有数据上下文的实例,则可以从 Mapping 属性访问元模型,因此此解决方案也不起作用。
  • 它对我有用,我也更新了解决方案,因为过度复杂的代码并没有什么意义。
【解决方案2】:

问题是你没有实体SchemaDataContext,所以根本没有映射。但是,如果您在 SchemaDataContext 中无论如何都没有实体,那么您真的不应该使用 ORM。

这是一个更简单的解决方案,没有 Linq to SQL:

public static IEnumerable<string> GetTables()
{
    using (var connection = new SqlConnection(ConnectionString))
    {
        connection.Open();
        foreach (var table in connection.GetSchema("Tables").Rows)
        {
            yield return (string)table[2];
        }
    }
}

【讨论】:

  • 这可能就足够了,尽管我希望将结果映射到一个对象,这样我就不必通过索引访问杂乱的数据表中的结果!
  • 更新:这不会切芥末。似乎没有办法用这种技术适当地询问外键约束。 (你可以看到什么表上有什么限制,但就目前而言)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多