Существует новая библиотека JayData , похожая на EntityFramework (или NHibernate) для платформы JavaScript: предоставляет Запрос языка JavaScript (JSLQ) и JavaScript CRUD. Также поддерживает определения моделей, navigationProperties и отношения 1..1.0, 1..m, m..n.
Я копирую короткий кодовый блокнот о том, как его использовать:
//define storage model: Department and Employee in a 1..m relation
$data.Entity.extend("$org.types.Department", {
Id: { type: "int", key: true, computed: true },
Name: { type: "string", required: true },
Address: { type: "string" },
Employees: { type: "Array", elementType: "$org.types.Employee", inverseProperty:"Department" }
});
$data.Entity.extend("$org.types.Employee", {
Id: { type: "int", key: true, computed: true },
FirstName: { type: "string", required: true },
LastName: { type: "string", required: true },
Department: { type: "$org.types.Department", inverseProperty:"Employees"}
});
$data.EntityContext.extend("$org.types.OrgContext", {
Department: { type: $data.EntitySet, elementType: $org.types.Department },
Employee: { type: $data.EntitySet, elementType: $org.types.Employee }
});
Вы можете кодировать против OrdContext и коллекций в нем. Следующая строка создаст экземпляр контекста, который поддерживается локальной WebSQL (у вас есть другие опции, такие как indexeddb или OData)
var context = new $org.types.OrgContext({ name: "webSql", databaseName: "OrgDB" });
Добавить данные
var department = new $org.types.Department({ Name: 'Finance', Employees: [] });
var emp1 = new $org.types.Employee({ FirstName: 'John', LastName: 'Smith'});
department.Employees.push(emp1);
var emp2 = new $org.types.Employee({ FirstName: 'Jane', LastName: 'Smith'});
emp2.Department = department;
context.add(department);
context.add(emp2);
context.saveChanges();
Теперь, когда у вас есть данные в хранилище, вы можете запросить их. Запросы JSLQ поддерживаются в полях сущностей, а также в полях навигации, которые указывают в направлении m..1. (В версии 1.0 вы не можете напрямую против 1..m navProperties. Вы можете обойти это с помощью in
выражения
//filter
context.Employees
.filter( function(emp) { return emp.LastName == 'Smith' })
.toArray(...);
//filter
context.Employees
.filter( function(emp) { return emp.FirstName.startsWith('J') ||
emp.LastName.toLowerCase.contains('mith') })
.toArray(...);
//filter2
context.Employees
.filter( function(emp) { return emp.Department.Id == 1 })
.toArray( function(emps) { } );
//filter2 + eager load
context.Employees
.include("Department")
.filter( function(emp) { return emp.Department.Id == 1 })
.toArray( function(emps) { } );
//map/project
context.Employees
.filter( function(emp) { return emp.Department.Id == 1 }).toArray(...)
.map( function(emp) { return { EmployeeName: emp.FirstName + emp.LastName,
DepartmentName: emp.Department.Name }})
.forEach( function(item) { ... })