每个Subclass继承表与PetaPoco / NPoco

时间:2015-03-10 15:49:36

标签: c# inheritance orm petapoco npoco

我正在使用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表。

如何正确实现?

1 个答案:

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