我在网上找到了一个例子(http://www.codeproject.com/Articles/511031/A-sample-real-time-web-application-using-Ember-js)开始学习Ember JS,这很酷,但我注意到它将数据保存到Ember.em文件中,该文件不像SQL Server或MySQL那样是DB。
我应该以何种方式将数据持久化到数据库中,比如说SQL Server。以下是当用户点击按钮从表中添加、更新、删除项目时调用的示例中的控制器代码:
namespace Ember.n.SignalR.Controllers
{
using System;
using System.Linq;
using System.Web.Mvc;
using Ember.n.SignalR.DS;
using Ember.n.SignalR.DTOs;
using Ember.n.SignalR.Validators;
using FluentValidation.Results;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Ember.n.SignalR.Hubs;
public class CustomerController : Controller
{
//
// GET: /Customer/
JsonSerializerSettings _settings = new JsonSerializerSettings {
ContractResolver = new CamelCasePropertyNamesContractResolver(),
NullValueHandling = NullValueHandling.Ignore
};
public ActionResult Index()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public string Read(Guid? id)
{
Result r = new Result { ErrorCode = 0, ErrorMessage = String.Empty };
if (id == Guid.Empty || id == null)
{
r.Data = CrudDS<Customer>.Items.AsEnumerable<Customer>();
}
else
{
r.Data = CrudDS<Customer>.Items.Find(c => c.Id == id);
}
return JsonConvert.SerializeObject(r, _settings);
}
[AcceptVerbs(HttpVerbs.Delete)]
public string Delete(Guid id)
{
Result r = new Result { ErrorCode = 0, ErrorMessage = "Delete customer successful." };
var customer = CrudDS<Customer>.Items.First(c => c.Id == id);
bool ok = (customer == null) ? false : CrudDS<Customer>.Items.Remove(customer);
CrudDS<Customer>.Serialize(DateTime.Now);
if (!ok)
{
r.ErrorCode = -1;
r.ErrorMessage = "Could not find customer with id=" + id;
}
r.Data = customer;
// Broadcast to all clients
CustomerHub.Instance.Clients.All.remove(JsonConvert.SerializeObject(customer, _settings));
return JsonConvert.SerializeObject(r, _settings);
}
[AcceptVerbs(HttpVerbs.Put)]
public string Update(Customer customer)
{
Result r = new Result { ErrorCode = 0, ErrorMessage = "Update customer successful." };
Customer item = CrudDS<Customer>.Items.Find(c => c.Id == customer.Id);
if (customer == null)
{
r.ErrorCode = -1;
r.ErrorMessage = "Could not find customer with id=" + customer.Id + ".";
}
else
{
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
if (!results.IsValid)
{
r.ErrorCode = -1;
r.ErrorMessage = results.Errors.First().ErrorMessage;
return JsonConvert.SerializeObject(r, _settings);
}
item.FirstName = customer.FirstName;
item.LastName = customer.LastName;
item.Email = customer.Email;
item.Phone = customer.Phone;
CrudDS<Customer>.Serialize(DateTime.Now);
}
r.Data = customer;
// Broadcast to all clients
CustomerHub.Instance.Clients.All.update(JsonConvert.SerializeObject(customer, _settings));
return JsonConvert.SerializeObject(r, _settings);
}
[AcceptVerbs(HttpVerbs.Post)]
public string Create(Customer customer)
{
Result r = new Result { ErrorCode = 0, ErrorMessage = "Create customer successful." };
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
if (!results.IsValid)
{
r.ErrorCode = -1;
r.ErrorMessage = results.Errors.First().ErrorMessage;
return JsonConvert.SerializeObject(r, _settings);
}
customer.Id = Guid.NewGuid();
CrudDS<Customer>.Items.Add(customer);
CrudDS<Customer>.Serialize(DateTime.Now);
r.Data = customer; // Return current customer
// Broadcast to all clients
CustomerHub.Instance.Clients.All.add(JsonConvert.SerializeObject(customer, _settings));
return JsonConvert.SerializeObject(r, _settings);
}
}
}
我应该只向这些函数添加代码以将数据持久化到SQL Server数据库中吗?如果是这样的话,我是不是先保存到SQL Server数据库,然后如果它成功地更新了.em文件(这就是它目前正在做的)?还是先更新.em文件,然后尝试持久保存到SQL Server数据库,如果失败,则撤消对.em的更新?
我似乎在网上找不到任何保存到.em文件以及持久保存到外部数据库(如SQL Server或MySQL)的示例。
谢谢!
看起来.em文件是用于演示的。
您应该能够更改CrudDS<>方法来持久化数据,并且前端的行为应该是相同的。
以下是WebAPI2模板创建的默认操作的Post示例:
[ResponseType(typeof(Customer))]
public async Task<IHttpActionResult> PostCustomer(Customer customer)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Context.Add(customer);
await db.SaveChangesAsync();
return CreatedAtRoute("DefaultApi", new { id = customer.Id }, customer);
}
您可以从示例中看到!ModelState.IsValid
属性与!results.IsValid
检查几乎相同。
EntityFramework基本上完成了所有工作,创建对象,并使用db.SaveChangesAsync()
持久化到存储。