0

Я работаю над приложением Windows Phone 8.1, и у меня возникают проблемы с получением объектов модели клиента для получения их значений из базы данных, которую я размещаю на Azure. Код, который я написал, кажется, работает (по крайней мере, итерации правильно), но моя проблема в том, что объекты Bars пусты. Я не знаю, как заставить их получать значения, хранящиеся в db (barID, barName и т. Д.). Я создал проект рабочих сервисов, который я опубликовал на веб-сайте Azure. Этот проект содержит мои DTO, контекст и контроллеры. Мой клиентский проект содержит модели и представления. Нужно ли мне менять свою архитектуру? Если да, то как мне его изменить? Вот код, который вызывается в мой контроллер:Пустые клиентские модели

public class BarsController : ApiController 
{ 
    private GatoradeShowerDB db = new GatoradeShowerDB(); 

    // GET: api/Bars 
    // [Route("http://gatoradeshower.azurewebsites.net/api/bars/All")] 
    public IQueryable<Bar> GetBars() 
    { 
     return db.Bars; 
    } 

    // GET: api/Bars/5 
    [ResponseType(typeof(Bar))] 
    public async Task<IHttpActionResult> GetBar(int id) 
    { 
     Bar bar = await db.Bars.FindAsync(id); 
     if (bar == null) 
     { 
      return NotFound(); 
     } 

     // return Ok(bar); 
     return Ok(bar); 
    } 

    // PUT: api/Bars/5 
    [ResponseType(typeof(void))] 
    public async Task<IHttpActionResult> PutBar(int id, Bar bar) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     if (id != bar.BarID) 
     { 
      return BadRequest(); 
     } 

     db.Entry(bar).State = EntityState.Modified; 

     try 
     { 
      await db.SaveChangesAsync(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!BarExists(id)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return StatusCode(HttpStatusCode.NoContent); 
    } 

    // POST: api/Bars 
    [ResponseType(typeof(Bar))] 
    public async Task<IHttpActionResult> PostBar(Bar bar) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     db.Bars.Add(bar); 
     await db.SaveChangesAsync(); 

     return CreatedAtRoute("DefaultApi", new { id = bar.BarID }, bar); 
    } 

    // DELETE: api/Bars/5 
    [ResponseType(typeof(Bar))] 
    public async Task<IHttpActionResult> DeleteBar(int id) 
    { 
     Bar bar = await db.Bars.FindAsync(id); 
     if (bar == null) 
     { 
      return NotFound(); 
     } 

     db.Bars.Remove(bar); 
     await db.SaveChangesAsync(); 

     return Ok(bar); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    private bool BarExists(int id) 
    { 
     return db.Bars.Count(e => e.BarID == id) > 0; 
    } 
} 

Вот мой DTO код:

public partial class Bar 
{ 
    public int BarID { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string BarName { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string BarStreet { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string BarCity { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string BarState { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string BarPhone { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string BarZip { get; set; } 
} 

Вот мой Context код:

public partial class GatoradeShowerDB : DbContext 
{ 
    public GatoradeShowerDB() 
     : base("name=GatoradeShowerDB") 
    { 
    } 

    public virtual DbSet<Bar> Bars { get; set; } 
    public virtual DbSet<Event> Events { get; set; } 
    public virtual DbSet<Game> Games { get; set; } 
    public virtual DbSet<Group> Groups { get; set; } 
    public virtual DbSet<Member> Members { get; set; } 
    public virtual DbSet<Stadium> Stadia { get; set; } 
    public virtual DbSet<Team> Teams { get; set; } 
    public virtual DbSet<TeamsTest> TeamsTests { get; set; } 
    public virtual DbSet<WatchParty> WatchParties { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Game>() 
      .Property(e => e.GameTime) 
      .IsFixedLength(); 

     modelBuilder.Entity<TeamsTest>() 
      .Property(e => e.teamName) 
      .IsUnicode(false); 
    } 
} 

Вот код из моего файла xaml.cs (вид):

public async void GetBars() 
{ 
    using (var client = new HttpClient()) 
    { 
     barsListBox.Items.Add("using block entered"); 
     client.BaseAddress = new Uri("http://nflff.azurewebsites.net"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     barsListBox.Items.Add("client's defaultrequestheaders done"); 

     HttpResponseMessage response = await client.GetAsync("api/bars"); 
     barsListBox.Items.Add("httpresponsemessage object created with getasync"); 
     barsListBox.Items.Add(response.Content.ToString()); 

     if (response.IsSuccessStatusCode) 
     { 
      barsListBox.Items.Add("if entered"); 
      IList<Bars> bars = await response.Content.ReadAsAsync<IList<Bars>>(); 
      //successfully retrieves all bars items but need to format the printing 
      //Wait... How can you instantiate a list ... to read itself? (Am I wrong) Nothing is being stored? 
      //barsListBox.Items.Add(bars); //this just prints System.Collection.Generic... 
      barsListBox.Items.Add(bars.Count); //list contains correct number of items 
      for (int i = 0; i < bars.Count; i++) 
      { 
       barsListBox.Items.Add("for entered"); //iterating correct number of times 
       barsListBox.Items.Add(i); //when printing bar[i], just prints empty object 
      } 
       //foreach (var bar in bars) 
       //{ 
       // barsListBox.Items.Add("foreach entered"); //not entering foreach 
       // barsListBox.Items.Add(bar.ToString()); 
       //} 

      barsListBox.Items.Add("after foreach loop"); //getting printed 
     } 
     barsListBox.Items.Add("after if"); 
    } 
} 

А вот код моей модели (на стороне клиента):

class Bars 
{ 
    private int barID { get; set; } 
    private string barName { get; set; } 
    private string barStreet { get; set; } 
    private string barCity { get; set; } 
    private string barState { get; set; } 
    private string barPhone { get; set; } 
    private string barZip { get; set; } 

    //public Bars() 
    //{ 
    // //empty constructor 
    //} 

    public override string ToString() 
    { 
     return "Bar: " + barID.ToString() +" " + barName.ToString() + " Phone: " + barPhone; //model obj not obtaining any values 
    } 
} 

Я в полной растерянности, так как это мой первый раз, создавая мобильное приложение с организованной базой данных. На данный момент я получаю правильное количество баров, возвращенных из вызова ReadAsAsync, но все они пусты. Как я могу заставить эти объекты Bars содержать их правильные значения? Моя база данных - это база данных SQL с базой данных .NET, размещенной на веб-сайтах Azure.

ответ

0

Я понял свою проблему. Мой код действительно работал правильно. Проблема заключалась в том, что когда я развернул свою базу данных на веб-сайт Azure, она создала новую базу данных с теми же таблицами и форматами, но без каких-либо данных. Когда я запускал свой веб-сайт через localhost, он работал нормально, потому что он использовал базу данных, в которой были мои образцы данных, но размещенная база данных не так уж и ничего не обнаружила. Чтобы исправить это, я импортировал образцы данных в новую размещенную базу данных и все работало правильно.

Смежные вопросы