当数据库架构发生变化时,我们如何避免破坏控制器方法的变化?
假设我正在返回一个对象:
public class Bike
{
public int Wheels {get;}
public int Id {get;}
}
在以下控制器中:
public class BikeController
{
[HttpGet]
public List<Bike> Get([FromBody] MyRequest request)
{
var context = new DbContext(_repository.Database.Connection.ConnectionString);
var procedure = request;
return context.Database.ExecuteStoredProcedure<Bike>(procedure).ToList();
}
}
在某些时候,数据库代码会发生变化。 我不想在C#中重新定义Bike模式。
当数据库架构发生变化时,我们如何更改Bike控制器方法的签名,以便不进行任何重大更改?
我正在寻找以下内容:
public IHttpActionResult Get()
{
var context = new DbContext(_repository.Database.Connection.ConnectionString);
var procedure = request;
return context.Database.ExecuteStoredProcedure<object>(procedure).ToList();
}
答案 0 :(得分:3)
我不明白为什么你的控制器根本需要改变,因为你只是直接返回检索到的类型而没有在你的action方法中引用它的任何属性。
此外,当您返回单个.ToList()
对象时,为什么要调用Bike
。此外,您可以考虑使用Model或ViewModel,而不是直接返回实体作为选项。
BaseEntity
并返回
BaseEntity obj = context.Database.ExecuteStoredProcedure<Bike>(procedure);
returb obj;
答案 1 :(得分:1)
我认为你有几个选择:
返回dynamic
而不是Bike
。但是,这会对dynamic
个对象的所有用户产生性能影响。
返回object
而不是Bike
。
但在这两种情况下,您的Bike存储过程仍将返回与Bike
对象不兼容的更新数据,因此您仍需要重新编译控制器。
BikeController
响应的标准对象,并匹配存储过程响应。考虑如何在SQL中处理数据库更新 - 您的SELECT语句指定了您需要的确切列,并且不受不影响返回列的架构更改的影响,或者如果您使用*
则忽略任何列你不需要,这不利于强类型或ORM。
答案 2 :(得分:1)
只要您不访问任何属性或使用任何方法,它的存在依赖于架构对象或与数据库相关的任何内容您是安全的。
使控制器与数据库模式无关,将使得由于数据库端的更改而不太可能更改此控制器,这就是Data Access layers
的原因。
我认为如果我们应用了关注点分离原则,我们会发现处理数据库不是Controller
责任,这必须通过某种Brokers
来完成,就像注入到数据库中的存储库接口类型一样。控制器构造函数。控制器只会看到插入,更新,删除方法,但它对数据库没有任何了解。
此外,它不是一个松散类型的对象。它是一种松散耦合的类型,你真正需要它。
答案 3 :(得分:1)
您只是从数据库中检索对象,对象内部的属性数量不会影响或破坏您的ActionMethod。
如果您仍然担心对象内的属性不是您想要在视图上呈现的原因,那么您可以使用ViewModel并使用您的Bike对象属性来填充视图模型并改为渲染视图模型。 / p>