2015-03-10 2 views
0

Я использую версию 2.6.88 из NPoco Micro-ORM.Таблица для наследования подкласса с PetaPoco/NPoco

Допустим, у меня есть иерархия классов, как это:

[NPoco.TableName("Person")] 
[NPoco.PrimaryKey("PersonID", AutoIncrement = false)]  
class Person 
{ 
    public Guid PersonID { get; set; } 
    public String Name { get; set; } 
} 

class Employee : Person 
{ 
    public String Department { get; set; } 
} 

Мне нужно отобразить эту иерархию классов в базу данных, разработанной с «Таблица на Подкласс» подход. Это означает, что у меня есть Person стол с колонками PersonID и Name, и у меня есть таблица Employee с колонками PersonID и Department.

Теперь, мой вопрос: как вставить нового сотрудника в базу данных с помощью NPoco? Я пытался что-то вроде этого:

Employee myEmployee = new Employee() { PersonID = Guid.NewGuid(), Name = "Employee Name", Department = "TestDepartment" }; 
NPoco.Database myDb = new NPoco("MyConnection"); 
using (var transaction = myDb.GetTransaction()) 
{ 
    myDb.Insert<Person>(myEmployee as Person); 
    myDb.Insert<Employee>("Employee", "PersonID", false, myEmployee); 
    transaction.Complete(); 
} 

Этот код не будет работать на первой вставки, потому что NPoco пытается вставить Employee определенные поля в таблицу Person.

Как это реализовать правильно?

ответ

0

Если вы используете NPoco, то вы начинаете транзакцию, вызывая myDb.GetTransaction(); и совершаете транзакцию, используя transaction.Complete();, но не так, как это отражено в вашем коде.

После изменения кода, вы можете использовать:

using (var transaction = myDb.GetTransaction()) 
{ 
    myDb.Insert<Person>(person); 
    var sql = new Sql("INSERT INTO Employee (Department,PersonId) VALUES(@0, @1)", employee.Department, employee.PersonId); 
    myDb.Execute(sql); 
    transaction.Complete(); 
} 

или добавить Name столбец в Employee таблицы и использовать следующие для вставки нового сотрудника

using (var transaction = db.GetTransaction()) 
{ 
    myDb.Insert<Person>(person); 
    myDb.Insert<Employee>("Employee", "PersonId", false, employee); 
    transaction.Complete(); 
} 
+0

Благодарим Вас за Ваш ответ ! Я обновлю свой вопрос относительно обработки транзакций. –

+0

Однако я не вижу, как любой из двух подходов, которые вы представили в своем ответе, решит мою проблему. У меня нет отдельного объекта 'person' и' employee' для вставки. У меня есть только объект 'myEmployee', который имеет тип' Employee', но также является «Person' (наследование). И в отношении вашего второго подхода: я не могу добавить столбец «Name» в таблицу «Employee», которая больше не будет «таблицей для каждого подкласса». –

+1

Следующие данные вставляются в обе таблицы без ошибок. 'var sql = new Sql (« INSERT INTO Person (Name, PersonId) VALUES (@ 0, @ 1) », myEmployee.Name, myEmployee.PersonId); myDb.Execute (SQL); sql = new Sql («INSERT INTO Employee (Department, PersonId) VALUES (@ 0, @ 1)», myEmployee.Department, myEmployee.PersonId); myDb.Execute (SQL); ' – kagundajm

Смежные вопросы