繁体   English   中英

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

[英]How to check table columns in dbml before executing query in Linq

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

问题:

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

找不到列

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

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

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

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

  1. 因此,您的应用程序版本1.1将包含较早的dbml
  2. 版本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:如何将记录插入视图?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM