【问题标题】:Empty client-side models空的客户端模型
【发布时间】:2015-03-20 00:56:56
【问题描述】:

我正在开发一个 Windows Phone 8.1 应用程序,我无法让客户端的模型对象从我托管在 Azure 上的数据库中获取它们的值。我编写的代码似乎有效(至少迭代正确),但我的问题是 Bars 对象是空的。我不知道如何让它们获取存储在数据库中的值(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; }
}

这是我的上下文代码:

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 对象包含它们的正确值?我的数据库是一个带有 .NET 后端的 SQL 数据库,托管在 Azure 网站上。

【问题讨论】:

    标签: c# entity-framework azure asp.net-web-api windows-phone-8.1


    【解决方案1】:

    我发现了我的问题。我的代码实际上工作正常。问题是,当我将数据库部署到 Azure 网站时,它创建了一个具有相同表和格式但没有任何数据的新数据库。当我通过 localhost 运行我的 web api 时,它运行良好,因为它使用的数据库中包含我的示例数据,但托管数据库没有,所以什么都不会显示。为了解决这个问题,我将示例数据导入到新的托管数据库中,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-09
      • 2015-12-21
      • 1970-01-01
      • 2016-11-28
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多