我正在使用Entity Framework 6.0构建C#Web API。我有最简单的用户类,有3个属性,我坚持将SQL存入用户表,其中有3个对应的列,其中UserID是其主键。
public partial class User
{
public string UserID {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
我想在Web API中添加两个仅用于输出的属性,我不想在我的数据库中存储这些属性。我使用这些属性与消费客户进行通信" Status"和"消息"不属于用户类的信息。状态=确定|错误|警告。消息将是Web API需要与调用客户端通信的任何消息。
我的问题是:在发送回Web API的响应而不修改SQL上的基础用户表时,动态添加这两个属性的最简单方法是什么?我知道我可以将这两个作为虚拟列添加到用户表中。当我不需要SQL时,我不想在SQL端带来这些开销。
答案 0 :(得分:1)
理想情况下,您应该在模型中使用所需的所有属性创建数据传输对象(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);
}
然后,您可以从nuget安装Automapper并将其配置为为您执行映射。
答案 1 :(得分:1)
我会采用更通用的方法:
public class MyResponse<T>
{
public T Data {get;set;}
public Status ResponseStatus{get;set;}
public string Message{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
}