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

时间:2014-12-05 12:03:08

标签: c# linq-to-sql

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

问题:

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

  找不到

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

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

3 个答案:

答案 0 :(得分:0)

我认为在您的情况下,您应该version您的代码。您正在使用的dbml应该反映数据库的模式,在您的情况下它不会发生。

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

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

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

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

答案 1 :(得分:0)

要解决此问题,我使用以下步骤:

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
            }

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

答案 2 :(得分:-1)

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

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

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

怎么做,在SO处回答: LINQ to SQL : How to Insert record into a view?