1

我正在使用Entity Framework 6.0構建C#Web API。我有最簡單的用戶類,其中有3個屬性,我將SQL持久化到用戶表中,其中3個相應的列,其中UserID是其主鍵。如何將屬性添加到Web API響應中,而不是存儲在我的數據庫中?

public partial class User 
{ 
    public string UserID {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

我想添加到Web API兩個輸出只屬性,我不喜歡存儲在我的數據庫。我使用這些屬性向消費客戶端傳達不屬於用戶類的「狀態」和「消息」信息。狀態= OK |錯誤|警告。消息將是Web API需要傳回給調用客戶端的任何消息。

我的問題是:什麼是最簡單的方式來添加這兩個屬性在發送回Web API的響應而不修改SQL上的底層用戶表?我知道我可以將這兩個作爲虛擬列添加到用戶表中。當我不需要它的時候,我不想在SQL方面進行這些開銷。

+0

不要返回EF對象作爲Web API響應。將屬性映射到某個DTO類並返回它。這個DTO應該包含User類的屬性和你想要的其他數據。 –

+0

謝謝emre。你可以添加一個例子嗎?請參閱下面的答案和我的回答。 –

回答

1

我會去與更通用的方法:

public class MyResponse<T> 
{ 
    public T Data {get;set;} 
    public Status ResponseStatus{get;set;} 
    public string Message{get;set;} 
} 

這樣,您就可以處理所有以同樣的方式,你的模型/數據。

UPDATE

[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 
} 
+0

這與我所尋找的非常接近。您可以添加您的解決方案如何調用您的代碼傳遞User對象並將其返回給Web API響應?謝謝。 –

+0

這是怎麼回事?我貼了輕微改變的通用迴應。 – jstadnicki

+1

太棒了。多麼優雅的解決方案。非常感謝,@jstadnicki。我從你的例子中肯定了解了很多。 –

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並將其配置爲爲您執行映射。

+0

謝謝,埃比米。這與我所尋找的非常接近。我的用戶類比這個大得多。我不想兩次維護它的模式。你能否擴展你的代碼來映​​射用戶類,而不需要手動編碼它的模式。我不知道如何使用Automapper。 –

相關問題