C# 如何向未存储在数据库中的Web API响应添加属性?
我正在使用Entity Framework 6.0构建一个C#Web API。我有一个最简单的用户类,它有3个属性,我将这些属性保存在一个用户表中,该用户表有3个对应的列,其中UserID是它的主键C# 如何向未存储在数据库中的Web API响应添加属性?,c#,entity-framework,asp.net-web-api,entity-framework-6,asp.net-web-api2,C#,Entity Framework,Asp.net Web Api,Entity Framework 6,Asp.net Web Api2,我正在使用Entity Framework 6.0构建一个C#Web API。我有一个最简单的用户类,它有3个属性,我将这些属性保存在一个用户表中,该用户表有3个对应的列,其中UserID是它的主键 public partial class User { public string UserID {get; set;} public string FirstName {get; set;} public string LastName {get; set;} } 我想在
public partial class User
{
public string UserID {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
我想在Web API中动态添加两个仅输出的属性,我不想将它们存储在数据库中。我使用这些属性与消费客户机通信不属于用户类的“状态”和“消息”信息。状态=正常|错误|警告。消息将是Web API需要与调用客户端通信的任何消息
我的问题是:在不修改SQL上的底层用户表的情况下,在发送回Web API响应时动态添加这两个属性的最简单方法是什么?我知道我可以将这两个列作为虚拟列添加到用户表中。我不想在不需要的情况下在SQL端带来这种开销。理想情况下,您应该在模型中创建一个包含所有所需属性的数据传输对象(DTO)类,然后使用映射器将您的用户映射到DTO
public class UserDto{
public string UserID {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public string Message {get; set;}
public string Status {get; set;}
}
然后在你的行动中
[ResponseType(typeof(UserDto))]
public IHttpActionResult User(string userId){
// retrive user from db
var userDto = Mapper.Map<UserDto>(dbUser);
if(condition){
userDto.Message = "the message";
userDto.Status = "the status";
}
return Ok(userDto);
}
[ResponseType(typeof(UserDto))]
公共IHttpActionResult用户(字符串用户ID){
//从数据库检索用户
var userDto=Mapper.Map(dbUser);
如果(条件){
userDto.Message=“消息”;
userDto.Status=“状态”;
}
返回Ok(userDto);
}
然后,您可以从nuget将Automapper安装到,并将其配置为为为您执行映射。我将采用更通用的方法:
public class MyResponse<T>
{
public T Data {get;set;}
public Status ResponseStatus{get;set;}
public string Message{get;set;}
}
公共类MyResponse
{
公共T数据{get;set;}
公共状态响应状态{get;set;}
公共字符串消息{get;set;}
}
这样,您可以以相同的方式处理所有模型/数据
更新
[AllowAnonymous]
[RoutePrefix("api/home")]
public class HomeController : ApiController
{
[HttpGet]
[Route("ok")]
public MyResponse<MyUser> OK()
{
MyUser m = new MyUser();
var r = MyResponse<MyUser>.Success(m);
return r;
}
[Route("nok")]
[HttpGet]
public MyResponse<MyUser> NOK()
{
var r = MyResponse<MyUser>.Error("something went terribly wrong");
return r;
}
}
public class MyResponse<T>
{
public T Data { get; set; }
public Status ResponseStatus { get; set; }
public string Message { get; set; }
private MyResponse() { }
public static MyResponse<T> Success(T data)
{
return new MyResponse<T> { Data = data, ResponseStatus = Status.Success };
}
public static MyResponse<T> Error(string message)
{
return new MyResponse<T> { ResponseStatus = Status.Error, Message = message };
}
}
public class MyUser
{
public int Id { get; set; }
public string Name { get; set; }
}
public enum Status
{
Unknown = 0,
Success = 1,
Error
}
[AllowAnonymous]
[RoutePrefix(“api/主页”)]
公共类HomeController:ApiController
{
[HttpGet]
[路线(“确定”)]
公共MyResponse OK()
{
MyUser m=新的MyUser();
var r=我的反应。成功(m);
返回r;
}
[路线(“nok”)]
[HttpGet]
公众回应NOK()
{
var r=MyResponse.Error(“出现了严重错误”);
返回r;
}
}
公共类MyResponse
{
公共T数据{get;set;}
公共状态响应状态{get;set;}
公共字符串消息{get;set;}
私有MyResponse(){}
公共静态MyResponse成功(T数据)
{
返回新的MyResponse{Data=Data,ResponseStatus=Status.Success};
}
公共静态MyResponse错误(字符串消息)
{
返回新的MyResponse{ResponseStatus=Status.Error,Message=Message};
}
}
公共类MyUser
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共枚举状态
{
未知=0,
成功=1,
错误
}
不要将ef对象作为web api响应返回。将属性映射到某个DTO类并返回它。此DTO应包含用户类的属性和所需的其他数据。谢谢您。你能举个例子吗?请看下面的答案和我的回答。这与我想要的非常接近。您能否在解决方案中添加如何调用代码来传递用户对象并将其返回到Web API响应?谢谢,这怎么样?我粘贴了稍加修改的通用响应。太棒了。多么优雅的解决方案。非常感谢你,@jstadnicki。我从你的例子中学到了很多。谢谢你,艾比米。这是非常接近我所寻找的。我的用户类比这个大得多。我不想两次维护它的模式。您可以扩展您的代码来映射用户类,而不必手工编码其模式。我不知道如何使用Automapper。