2013-06-12 2 views
0

Database Diagramкомплексы поле Манипуляции в Jaydata

У меня есть структура базы данных, как это. Каждый сотрудник принадлежит отделу, каждый запас принадлежит отделу, у каждого отдела есть список сотрудников и список связанных с ним акций. Я инициализировать базу данных с этим кодом:

$data.define("Org.Department",{ 
    ID: {key: true, type: "integer", computed: true}, 
    DepartmentID: {type: "integer", required: true}, 
    DepartmentName: {type: "string", required: true}, 
    Employee:{type: Array, elementType: "Org.Employee", navigationProperty:"Department"}, 
    Stock:{type: Array, elementType: "Org.Stock", navigationProperty:"Department"} 
}); 

$data.define("Org.Employee",{ 
    ID: {key: true, type: "integer", computed: true}, 
    Name: {type: "string", required: true}, 
    DepartmentID: {type: "integer", required: true}, 
    Department: {type: "Org.Department", inverseProperty: "Employee"} 
}); 

$data.define("Org.Stock",{ 
    ID: {key: true, type: "integer", computed: true}, 
    DepartmentID: {type: "integer", required: true}, 
    Description: {type: "string"}, 
    NumItems: {type: "integer", required: true}, 
    Department: {type: "Org.Department", inverseProperty: "Stock"} 
}); 

$data.EntityContext.extend("Company",{ 
    Employees: {type: $data.EntitySet, elementType: Org.Employee}, 
    Departments: {type: $data.EntitySet, elementType: Org.Department}, 
    Stocks: {type: $data.EntitySet, elementType: Org.Stock} 
}); 

var x= new Company({ 
    provider: "webSql", 
    databaseName: "DB", 
    version: 1, 
    dbCreation: $data.storageProviders.DbCreationType.DropAllExistingTables 
}); 

Что я хочу сделать, это добавление элементов в эту базу данных, но я должен сделать правильные соединения. Я имею в виду правильные подключения, я хочу запросить имя всех сотрудников, чей запрос требует от меня поискать имя отдела и взять список сотрудников из него, а затем перечислить их имена. Я пробовал много вещей, но он полностью терпит неудачу. Например:

x.onReady(function(){ 
    var dep; 
    x.Departments.filter(function(res){ 
    return res.DepartmentID==4; 
    }).forEach(function(it){ 
    dep=it; 
    }); 
    console.log(dep); 
    var emp=new Org.Employee({ 
    Name: 'Employee1', 
    DepartmentID: 4, 
    Department:dep 
    }); 
    x.Employees.add(emp); 
    x.Employees.saveChanges(); 
}); 

Который не вносит правильную информацию Департамента в сотрудника. Когда я запрашиваю поле Департамента Employee1, я получаю undefined.

Это также не:

x.Employees.add({Name:"Employee1",DepartmentID:4}); 

Все запросы успешно вставляет некоторые данные в базу данных, но их поле Отдел пуст, которая побеждает все цели с реляционной базой данных.

ответ

2

Я установил две важные вещи в коде и теперь он работает:

  1. navigationProperty должен быть inverseProperty. Вы всегда должны определить другую сторону отношений с inverseProperty - пожалуйста, поделитесь URL-адресом, в котором вы нашли этот navigationProperty, я проверяю, могу ли я исправить его
  2. , если вы читаете элемент из базы данных и устанавливаете его в отношениях , вы должны прикрепить элемент к контексту

    $ data.define ("Org.Department", { ID: {ключ: верно, тип: "INT", вычисленная: истинно}, DepartmentID: {тип : "int", required: true}, DepartmentName: {type: "string", required: true}, Сотрудник: {type: Array, elementType: "Org.Employee", inverseProperty: "Department"}, Акции : {type: Array, elementType: "Org.Stock", inverseProperty: "Departme nt "} });

Фиксированный код:

$data.define("Org.Employee",{ 
    ID: {key: true, type: "int", computed: true}, 
    Name: {type: "string", required: true}, 
    DepartmentID: {type: "int", required: true}, 
    Department: {type: "Org.Department", inverseProperty: "Employee"} 
}); 

$data.define("Org.Stock",{ 
    ID: {key: true, type: "int", computed: true}, 
    DepartmentID: {type: "int", required: true}, 
    Description: {type: "string"}, 
    NumItems: {type: "int", required: true}, 
    Department: {type: "Org.Department", inverseProperty: "Stock"} 
}); 

$data.EntityContext.extend("Company",{ 
    Employees: {type: $data.EntitySet, elementType: Org.Employee}, 
    Departments: {type: $data.EntitySet, elementType: Org.Department}, 
    Stocks: {type: $data.EntitySet, elementType: Org.Stock} 
}); 

var x= new Company({ 
    provider: "webSql", 
    databaseName: "DB", 
    version: 1 
}); 

x.onReady(function(){ 
    var newDep = new x.Departments.elementType({DepartmentName: 'dep1', DepartmentID: 7}); 
    x.Departments.add(newDep); 
    x.saveChanges(function() { 
     x.Departments.first("it.DepartmentName == 'dep1'", {}, function(dep){ 
       console.log(dep); 
       x.Departments.attach(dep); 
       var emp = new Org.Employee({ 
       Name: 'Employee1', 
       DepartmentID: dep.DepartmentID, 
       Department:dep 
       }); 
       console.log(emp); 
       x.Employees.add(emp); 
       x.Employees.saveChanges(); 
     }); 
    }) 
}); 

Вы можете найти живую версию на jsfiddle

+0

Glorious благодаря вам! – AutomaticHourglass

+0

Я сделал функцию, которая берет объект сотрудника и вставляет его в базу данных, благодаря вам. Но он вызывает несколько ошибок, когда я называю их несколькими. Как я могу вставить несколько записей, используя только одну функцию, которая принимает список сотрудников? – AutomaticHourglass

+0

показать нам код –