Я использую версию 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.
Как это реализовать правильно?
Благодарим Вас за Ваш ответ ! Я обновлю свой вопрос относительно обработки транзакций. –
Однако я не вижу, как любой из двух подходов, которые вы представили в своем ответе, решит мою проблему. У меня нет отдельного объекта 'person' и' employee' для вставки. У меня есть только объект 'myEmployee', который имеет тип' Employee', но также является «Person' (наследование). И в отношении вашего второго подхода: я не могу добавить столбец «Name» в таблицу «Employee», которая больше не будет «таблицей для каждого подкласса». –
Следующие данные вставляются в обе таблицы без ошибок. '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