如何在 Linq 中执行查询之前检查 dbml 中的表列
本文关键字:dbml 检查 查询 Linq 执行 | 更新日期: 2023-09-27 18:33:17
我有一个窗口应用程序,我们将在不同的系统上运行它来更新数据库。假设我们有 10 个系统。在 10 个系统中,有 2 个系统使用最新的应用程序和最新的 DBML。在最新的DBML中,我在表中添加了列。对于这些系统,一切正常。
问题:
当我尝试在使用旧数据库的旧系统上运行它时。当我运行应用程序时,它会抛出错误
未找到列
这背后的原因是DBML已更新,但数据库未更新。
我该如何处理这种情况?由于某些限制,我无法更新数据库。
我认为在您的情况下,您应该对代码进行版本控制。您使用的 dbml 应反映数据库的架构,在您的情况下不会发生。
因此,我建议您使用两个版本的应用程序,每个版本都使用数据库更新dbml。
- 因此,您的应用程序版本 1.1 将包含较旧的 dbml 版本
- 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:如何将记录插入视图?