我正在使用NPoco Micro-ORM的2.6.88版本。
假设我有一个类层次结构:
[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 :(得分: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();
}