如何使LINQ to SQL向后兼容

时间:2009-10-21 19:52:39

标签: linq linq-to-sql

我是LINQ to SQL的新手....我需要在现有表中添加一个新列,并更新了dbml以包含这个新字段。然后在我的C#代码中,我查询数据库并访问这个新字段。新数据库的一切都很好;但是,如果我在没有这个新字段的情况下加载以前的数据库,我的程序在访问数据库时会崩溃(显然是因为这个新字段)。我如何使用数据库或我的C#代码来支持向后兼容?

这是我的代码片段

我在Customer表中添加了一个字段电子邮件,并将其添加到DataContext.dbml,下面是c#代码

DataContext ctx = new DataConext ();
var cusList = ctx.Customer;
foreach (var c in cusList)
{
.
.
.
//access the new field
if (c.email != null)
   displayEmail (email);

.
.
.
}

当我运行调试器时,如果我使用的是没有新电子邮件字段的旧版本数据库,那么它会在第一个foreach循环中崩溃。

感谢。

3 个答案:

答案 0 :(得分:1)

确保升级旧数据库。这就是更新的内容。

我认为没有更好的选择。但我可能错了。

答案 1 :(得分:1)

应该是代码土地修复。让代码检查列是否存在,并对每种情况使用不同的查询。

答案 2 :(得分:0)

我同意Arnis L:升级您的旧数据库。 LTS将要在您的表中查找名为email的列,并且如果找不到它将会抱怨。我可以建议一个需要使用存储过程的解决方法,但是你需要更新你的旧数据库以使用这个存储过程,所以这不是一个非常有用的建议: - )

如何更新旧数据库?这是老式的方式:

ALTER TABLE Customers
ADD Email VARCHAR(130) NULL

例如,您可以通过查询分析器对旧数据库手动执行此操作。有关ALTER TABLEhttp://msdn.microsoft.com/en-us/library/aa275462%28SQL.80%29.aspx

的完整文档,请参阅此处

如果您正在组建一个团队,从开发到生产系统的部署过程非常严格,那么您就已经以同样的方式将“更改脚本”写入数据库了。但是,如果您是通过企业管理器进行开发,那么第二次执行相同的工作可能会产生相反的效果,只是为了使旧的数据库模式与最新的模式保持同步。

对于后一种开发风格的友好,更“粘糊糊”的方法,我自己不能推荐使用非常优秀的Red Gate SQL Compare工具来帮助您保持多个SQL Server数据库同步。 (还有其他第三方实用程序可能大致相同,甚至可能更便宜一点,但我没有进一步了解它们。)

祝你好运!
-Mike