如果数据库中的列发生变化,有没有办法不破解代码?

Xai*_*oft 5 c#

假设我有一个声明的数据表,并且我已经分配了一个从调用存储过程返回的结果,所以现在,我的数据表在从中访问行时包含类似下面的内容:

string name = dr["firstname"];
int age = (int)dr["age"];
Run Code Online (Sandbox Code Playgroud)

如果firstname更改为first_name并且删除了age,则代码显然会中断,因为现在架构已损坏,所以有没有办法在不手动执行的情况下始终使架构与代码保持同步?是否有某种元描述文件描述数据库表中的列并相应地更新它们?这是LINQ因其强烈的类型特性而有用的情况吗?

Ben*_*ter 9

  1. 如果按列名称选择良好的旧式视图,它们总是以指定的顺序输出具有指定名称的列.如果下面的表需要更改,则视图会在必要时进行修改,但仍会像在基础表更改之前那样输出 - 就像对象的接口一样.应用程序引用视图而不是表,并继续正常工作.这归结为标准数据库应用程序设计,应该在任何(甚至基本的)数据架构师课程中讲授 - 但我很少看到这些实际应用于业务应用程序.事实上,我目前正在进行的项目是我第一次看到这种方法,并且实际上看到它正确使用它是令人耳目一新的.

  2. 使用存储过程,如果表更改,则修改存储过程以使输出仍然相同 - 以类似的方式使用以屏蔽应用程序与基础表,从而使应用程序与任何表更改隔离.如果您希望在视图更合适的情况下进行动态连接,过滤器和聚合,那就不够了.

  3. 如果要在应用程序端执行此操作,请在查询中指定要查询的字段的名称,而不是使用"select*"并依赖字段名称存在.但是,如果表上的字段名称发生更改,或者列被删除,则您仍然卡住,您必须修改查询.

  4. 如果字段名称更改,但所有字段将始终存在,则这些字段的内容将保持不变,并且字段将保持相同的顺序,您可以按索引而不是按名称引用字段.

  5. 像其他人指定的那样使用对象关系映射器,但我不认为这必然会教导好的设计,而不是希望框架的设计足够好并适合你正在做的事情,这可能是也可能不是.我并不认为这是一个很好的方法.


Ada*_*itt 5

关于防止这种情况的唯一方法是使用存储过程选择列并将它们重命名为返回给应用程序的标准名称.但是,这确实为数据库添加了另一层维护.

  • 这不是唯一的方法,视图可以用于屏蔽应用程序与表的相同效果,但仍然提供对数据的访问. (3认同)