空客户端模型
Empty client-side models
我正在开发 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 对象包含它们正确的值?我的数据库是一个 SQL 数据库,其后端托管在 Azure 网站上。
我想通了我的问题。我的代码实际上工作正常。问题是,当我将数据库部署到 Azure 网站时,它创建了一个具有相同表格和格式但没有任何数据的新数据库。当我 运行 我的网站 api 通过本地主机时,它工作正常,因为它使用的数据库中有我的示例数据,但托管数据库没有,所以什么也不会显示。为了解决这个问题,我将示例数据导入了新的托管数据库,一切正常。
我正在开发 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 对象包含它们正确的值?我的数据库是一个 SQL 数据库,其后端托管在 Azure 网站上。
我想通了我的问题。我的代码实际上工作正常。问题是,当我将数据库部署到 Azure 网站时,它创建了一个具有相同表格和格式但没有任何数据的新数据库。当我 运行 我的网站 api 通过本地主机时,它工作正常,因为它使用的数据库中有我的示例数据,但托管数据库没有,所以什么也不会显示。为了解决这个问题,我将示例数据导入了新的托管数据库,一切正常。