[英]How to check table columns in dbml before executing query in Linq
我有一个窗口应用程序,我们将在不同的系统上运行该应用程序以更新数据库。 假设我们有10个系统。 在10个系统中,有2个系统正在使用具有最新DBML的最新应用程序。 在最新的DBML中,我在表中添加了列。 对于这些系统,一切正常。
问题:
当我尝试在使用旧数据库的旧系统上运行它时。 当我运行应用程序时会引发错误
找不到列
其背后的原因是DBML已更新,但数据库未更新。
我该如何处理这种情况? 由于某些限制,我无法更新数据库。
我认为您应该对代码进行版本控制 。 您正在使用的dbml应该反映数据库的架构,在您的情况下则不会发生。
因此,我建议您使用两个版本的应用程序,每个版本的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.