0

我正在使用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; }
}

我需要将这个类层次结构映射到使用“每个子类的表”方法设计的数据库。这意味着我有一个包含PersonPersonID和的表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 表中。

我该如何正确实施?

4

1 回答 1

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();
}

或在表中添加一NameEmployee并使用以下内容插入新员工

using (var transaction = db.GetTransaction())
{
    myDb.Insert<Person>(person);
    myDb.Insert<Employee>("Employee", "PersonId", false, employee);
    transaction.Complete();
}
于 2015-03-12T21:11:25.240 回答