假设我声明了一个数据表,并且我已经为这个数据表分配了一个从调用存储过程返回的结果,所以现在,我的数据表在访问其中的一行时包含如下内容:
string name = dr["firstname"];
int age = (int)dr["age"];
如果将 firstname 更改为 first_name 并删除 age,代码显然会中断,因为现在模式已中断,那么有没有一种方法可以始终自动使模式与代码保持同步,而无需手动执行?是否有某种元描述文件描述数据库表中的列并相应地更新它们?在这种情况下,LINQ 是否可以因其强类型性质而有所帮助?
最佳答案
按列名选择的老式 View 怎么样,它们总是以指定顺序输出具有指定名称的列。如果下面的表需要更改,则 View 会在必要时进行修改,但仍会输出与基础表更改之前相同的输出——就像对象的接口(interface)一样。应用程序引用 View 而不是表并继续正常工作。这归结为标准的数据库应用程序设计,应该在任何(甚至是基础的)数据架构师类(class)中教授——但我很少看到这些在业务应用程序中实际使用。事实上,我目前正在从事的项目是我第一次看到采用这种方法的项目,实际看到它被正确使用令人耳目一新。
使用存储过程,如果您的表发生变化,请修改存储过程以使输出仍然相同 - 以类似的方式使用以将应用程序与基础表隔离开来,从而使应用程序免受任何表更改的影响。如果您希望在 View 更合适的地方执行动态联接、筛选和聚合,这还不够。
如果您想在应用程序端执行此操作,请直接在查询中指定要查询的字段名称,而不是使用“select *”并依赖字段名称的存在。但是,如果表中的字段名称发生变化,或者列被删除,您仍然卡住了,您必须修改查询。
如果字段的名称将改变,但所有字段将始终存在,这些字段的内容将保持不变并且字段将保持相同的顺序,您可以按索引而不是按名称引用字段。
使用其他人指定的对象关系映射器,但我认为这不一定会教出良好的设计,而不是希望框架的设计足够好并且适合您正在做的事情,这可能或可能并非如此。不过,我并不是真的认为这是一个好方法。
关于c# - 如果数据库中的列发生变化,有没有办法不破坏代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1929205/