2015-07-28 18 views
5
ngoại

tôi đang làm việc trên dự án WebAPI và tôi có 2 đơn vị trong phạm vi của tôi:
đườngASP.NET WebAPI JSON đáp ứng và thực thể với phím

public class Street 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int StreetTypeID { get; set; } 
    public virtual StreetType StreetType { get; set; } 
} 

và StreetType:

public class StreetType 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Street> Streets { get; set; } 
} 

Tôi sử dụng FluenApi để lập bản đồ các thực thể này:

public class StreetTypeMap : EntityTypeConfiguration<StreetType> 
{ 
    public StreetTypeMap() 
    { 
    HasKey(t => t.ID); 
    Property(t => t.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    Property(t => t.Name).IsRequired().HasMaxLength(50); 
    HasMany(a => a.Streets).WithRequired(p => p.StreetType).HasForeignKey(p => p.StreetTypeID); 
    ToTable("StreetType"); 
    } 
} 

và tương tự f hoặc thực thể Đường phố.
Bây giờ tôi nhận được JSON:

{ 
    "id":1, 
    "name":"Street1", 
    "streettypeid":3 
} 

Làm thế nào tôi có thể nhận được JSON như:

{ 
    "id":1, 
    "name":"Street1", 
    "streettypeid": 
    { 
    "id":3, 
    "name":"Type3" 
    } 
} 

Hoặc một số cấu trúc tương tự. Làm thế nào tôi có thể thực hiện điều này trong .NET?

điều khiển của tôi:

StreetController : BaseApiController<Street> 

public class BaseApiController<T> : ApiController where T : BaseEntity 
    { 
     protected UnitOfWork unitOfWork = new UnitOfWork(); 

     protected IRepository<T> repository; 

     public BaseApiController() 
     { 
      repository = unitOfWork.EFRepository<T>(); 
     } 
     public virtual IQueryable<T> Get() 
     { 
      var entity = repository.Table; 

      if (entity == null) 
      { 
       throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NoContent)); 
      } 
      return entity; 
     } 

}

Trả lời

2

Để giữ gìn tài liệu tham khảo đối tượng trong JSON, thêm đoạn mã sau vào phương pháp Application_Start trong file Global.asax:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.PreserveReferencesHandling = 
    Newtonsoft.Json.PreserveReferencesHandling.All; 

Đối datail hơn xin vui lòng đọc this bài viết.

Một cách khác là cố gắng sử dụng OData trong webapi của bạn. Bạn cần phải cài đặt các gói OData:

Install-Package Microsoft.AspNet.Odata 

Sau đó, bạn sẽ có thể sử dụng yo $expand gây các đơn vị liên quan để đưa nội tuyến trong các phản ứng.
Bạn có thể để lại tất cả như là, nhưng tôi nghĩ rằng nó sẽ đúng cách để thêm IgnoreDataMember (đừng quên thêm using System.Runtime.Serialization;)

public class StreetType 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    [IgnoreDataMember] 
    public virtual ICollection<Street> Streets { get; set; } 
} 

Cũng cần thêm thuộc tính để bạn Get phương pháp:

[EnableQuery] 
public virtual IQueryable<T> Get() 

Sau đó, bạn có thể tạo yêu cầu http như:

http://blablabla/Street?$expand=StreetType 

và nhận tất cả Streets với StreetType

+0

Cảm ơn bạn. Tôi thử nó Tôi đã nhận một lỗi: 'Không thể tìm thấy một tài sản có tên 'StreetTypes' trên loại 'Domain.Entities. Street '. "' –

+0

Bạn sử dụng yêu cầu http nào? – Marusyk

+0

'http: // mysite/Street? $ Expand = StreetTypes' –

1

Bạn cần phải tạo ra một mô hình nhằm trở lại có đơn vị bao gồm.

Chỉnh sửa: đây là phương pháp điều khiển api hoàn chỉnh bao gồm tuyến đường được đề xuất.

[HttpGet, Route("/api/streets/{id:int:min(1)}")] 
    public IHttpActionResult GetYourJsonData(int id) 
    { 
     try 
     { 
      //from your unit of work class 
      return uow.GetEntities<Street>(x => x.ID == id) 
       .FirstOrDefault() 
       .Select(viewModel => new { 
        ID = viewModel.ID, 
        Name = viewModel.Name, 
        StreetTypeID = viewModel.StreetType //consider renaming this to streeytype and not street type id 
       }); 
     } 
     catch(Exception) 
     { 
      return InternalServerError(); 
     } 
    } 



//Edit: in your repo class 
public IEnumerable<T> GetEntities<T>(Func<T, bool> predicate) where T : class 
{ 
    return yourContext.Set<T>().Where(predicate); 
} 
+0

Cảm ơn nhưng tôi không thể sử dụng dbContext trong bộ điều khiển vì có mẫu triển khai UnitOfWork và tôi không có dbContext –

+1

Bạn có thể cập nhật câu hỏi của mình để hiển thị những gì bạn đang sử dụng để lấy dữ liệu không? Cuối cùng nó sẽ giống nhau, phần bối cảnh dữ liệu sẽ chỉ di chuyển bên trong kho lưu trữ của bạn mà đơn vị công việc của bạn tiếp xúc. –

+0

Tôi vừa cập nhật câu hỏi. –

Các vấn đề liên quan