我是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循环中崩溃。
感谢。
答案 0 :(得分:1)
确保升级旧数据库。这就是更新的内容。
我认为没有更好的选择。但我可能错了。
答案 1 :(得分:1)
应该是代码土地修复。让代码检查列是否存在,并对每种情况使用不同的查询。
答案 2 :(得分:0)
我同意Arnis L:升级您的旧数据库。 LTS将要在您的表中查找名为email的列,并且如果找不到它将会抱怨。我可以建议一个需要使用存储过程的解决方法,但是你需要更新你的旧数据库以使用这个存储过程,所以这不是一个非常有用的建议: - )
如何更新旧数据库?这是老式的方式:
ALTER TABLE Customers
ADD Email VARCHAR(130) NULL
例如,您可以通过查询分析器对旧数据库手动执行此操作。有关ALTER TABLE
:http://msdn.microsoft.com/en-us/library/aa275462%28SQL.80%29.aspx
如果您正在组建一个团队,从开发到生产系统的部署过程非常严格,那么您就已经以同样的方式将“更改脚本”写入数据库了。但是,如果您是通过企业管理器进行开发,那么第二次执行相同的工作可能会产生相反的效果,只是为了使旧的数据库模式与最新的模式保持同步。
对于后一种开发风格的友好,更“粘糊糊”的方法,我自己不能推荐使用非常优秀的Red Gate SQL Compare工具来帮助您保持多个SQL Server数据库同步。 (还有其他第三方实用程序可能大致相同,甚至可能更便宜一点,但我没有进一步了解它们。)
祝你好运!
-Mike