如何在 Linq 中执行查询之前检查 dbml 中的表列

本文关键字:dbml 检查 查询 Linq 执行 | 更新日期: 2023-09-27 18:33:17

我有一个窗口应用程序,我们将在不同的系统上运行它来更新数据库。假设我们有 10 个系统。在 10 个系统中,有 2 个系统使用最新的应用程序和最新的 DBML。在最新的DBML中,我在表中添加了列。对于这些系统,一切正常。

问题:

当我尝试在使用旧数据库的旧系统上运行它时。当我运行应用程序时,它会抛出错误

未找到列

这背后的原因是DBML已更新,但数据库未更新。

我该如何处理这种情况?由于某些限制,我无法更新数据库。

如何在 Linq 中执行查询之前检查 dbml 中的表列

我认为在您的情况下,您应该对代码进行版本控制。您使用的 dbml 应反映数据库的架构,在您的情况下不会发生。

因此,我建议您使用两个版本的应用程序,每个版本都使用数据库更新dbml。

  1. 因此,您的应用程序版本 1.1 将包含较旧的 dbml
  2. 版本
  3. 1.2 是具有更新的 dbml 的实际版本

更新

所以我的答案是否定的,你不能做这样的事情,因为 dbml(不反映数据库)认为列都存在。

因此,您可以尝试使用标准SqlCommand检查此列,并直接对数据库进行查询。

为了解决这个问题,我使用以下步骤:

1.在项目中添加了比旧 DBML 更多的 DBML。在这里,我删除了带有旧模式的表。

2.获取表格列如下:

 class CheckVersion
{
    public static bool isOldSystem;
    public static void CheckColumnsInMasterInventory()
    {
        string[] Columns = { "Col1", "Col2", "Col3", "Col4" };//New Columns Which are not present in Old table.
        List<string> ColumnList = new List<string>();
        using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
        {
            using (var schemaCommand = new SqlCommand("SELECT * FROM dbo.Table1", con))
            {
                con.Open();
                using (var reader = schemaCommand.ExecuteReader())
                {
                    DataTable dt = new DataTable();
                    dt.Load(reader);
                    foreach (DataColumn column in dt.Columns)
                    {
                        ColumnList.Add(column.ColumnName);
                    }
                }
            }
        }
        var columnCount = ColumnList.Where(item => Columns.Contains(item)).Count();
        if (columnCount == 4)
            isOldSystem = false;
        else
            isOldSystem = true;
    }
}

3.在

isOldSystem 

值我正在执行 linq,如下所示:

  DataLoaderDataContext objDC = new DataLoaderDataContext(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        DataLoaderOldDataContext objOldDC = new DataLoaderOldDataContext(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
            if (!CheckVersion.isOldSystem)
            {
                //objDC
            }
            else
            {
               //objOldDC
            }

现在我能够处理旧数据库和新数据库。

这可能是创建可更新视图的选项。我知道你可以向DBML添加视图。

http://msdn.microsoft.com/en-us/library/ms187956.aspx

从理论上讲,这是可行的。但我不得不承认,我在现实生活中从未尝试过这个。

如何做到这一点,在SO这里回答:LINQ to SQL:如何将记录插入视图?