首页 > 解决方案 > 如何插入具有另一个类(外键)属性的 PetaPoco 对象?

问题描述

为了简化和缩短我的问题,假设我有以下课程:

[TableName("persons")]
[PrimaryKey("person_id")]
public class Person {

     [Column("person_id")]
     public int Id { get; set; }

     public string Name { get; set; }

     [Column("car_id")]
     public Car Car { get; set; }
}

[TableName("cars")]
[PrimaryKey("car_id")]
public class Car {
    [Column("car_id")]
    public int Id { get; set; }
    public string Color { get; set; }
    [Column("year")]
    public int YearOfMake { get; set; }
}

同样,为了简单起见,让我们假设每个Person人都有一个Car,这就是数据库当前的状态(我知道我可以简单地使用一个表,但这只是一种简化)。

我可以使用以下方法获取Person对象及其Car属性:

using(var db = GetDatabase())
{
    string sql = "select * from persons p left join cars c on c.car_id = p.car_id";
    Person p = db.Fetch<Person, Car>(sql).FirstOrDefault();
    Console.WriteLine(String.Format("Person: {0} has a {1} car", p.Name, p.Car.Color));
}

我面临的第一个问题是,如果数据库结果表中的两列具有相同的名称,那么 PetaPoco 将它们在我的对象中的两个值都设置为零。我设法重命名列以避免该问题。

真正的问题是当我尝试保存/插入一个Person对象时。如果对象只有原始值类型,它就可以工作,但是Car对象使事情变得困难。

这是我尝试过的:

Person p2 = new Person { Name = "mike", Car = new Car {Id = 42, Color = "red", YearOfMake = 2003 }};

db.Insert<Person>(p2);      // error: can't convert `Car` to `Int32`
db.Insert<Person, Car>(p2); // error: can't convert `Car` to `Int32`

如何插入具有类类型作为其属性之一的对象?

标签: c#petapoco

解决方案


PetaPoco 不会为您处理这样的接线关系。您必须自己管理依赖项。

请看看我在这个集成测试中是如何做到的

通常,您会创建一些辅助方法来为您处理此问题;)


推荐阅读