Как отобразить класс childs / parent с petapoco? - PullRequest
2 голосов
/ 01 декабря 2011

У меня есть эти классы:

class Car {
    int ID;
    string Name;
}

class Truck : Car {
    int MaximumLoad;
}

У меня есть эти таблицы

Car
- ID
- Name

Truck
- CarID
- MaximumLoad

Как я могу сопоставить свои классы с моей таблицей, используя PetaPoco?

Ответы [ 3 ]

3 голосов
/ 05 января 2013

Если вы храните автомобиль и грузовик в одной таблице ( TPH ), вы можете наследовать грузовик от автомобиля с небольшими изменениями исходного кода PetaPOCO,

таблица Транспортное средство (идентификатор, дискриминатор, имя), MaximumLoad)

в PetaPOCO.cs, добавьте

[AttributeUsage(AttributeTargets.Class)]
public class DiscriminatorAttribute : Attribute
{
    public int Value { get; private set; }
    public DiscriminatorAttribute(object discriminator)
    {
        Value = (int)discriminator;
    }
}

protected bool IsTPHTable<T>()
{
    var t = typeof(T);
    var a = t.GetCustomAttributes(typeof(DiscriminatorAttribute), true);
    return a.Length > 0;
}

protected void AppendDiscriminator<T>(Sql sql)
{
    var t = typeof(T);
    var a = t.GetCustomAttributes(typeof(DiscriminatorAttribute), true);
    sql.Append("Where Discriminator = @0", (a[0] as DiscriminatorAttribute).Value);
}

public IEnumerable<T> Query<T>(Sql sql)
{
    if (IsTPHTable<T>())
        AppendDiscriminator<T>(sql);
    return Query<T>(default(T), sql);
}

// also similar AppendDiscriminator() for Update an Delete.

Затем в ваших Car.cs и Truck.cs вы можете написать / сгенерировать такой код,

public enum VehicleType:int
{
    Car,
    Truck
}

[TableName("Vehicle")]
[Discriminator(VehicleType.Car)]
public class Car  
{
    [Column] 
    public int ID {get; set;}
    [Column]
    public string Name {get; set;}

    public Car()
    {
        //this.Discriminator = VehicleType.Car;
    }
    public static new Car SingleOrDefault(object primaryKey) { return repo.SingleOrDefaultById<Car>(primaryKey); }
    //...
}

[Discriminator(VehicleType.Truck)]
public class Truck:Car  
{
    [Column] 
    public double MaximumLoad {get;set;}

    public Truck()
    {
        //this.Discriminator = VehicleType.Truck;
    }   
    public static new Truck SingleOrDefault(object primaryKey) { return repo.SingleOrDefaultById<Truck>(primaryKey); }
    //...
}
2 голосов
/ 08 декабря 2011

Чтобы читать записи грузовиков, я бы создал представление Trucks, которое объединяет две таблицы. Или взгляните на несколько наборов результатов Schotime:

http://schotime.net/blog/index.php/2011/11/20/petapoco-multiple-result-sets/

Для записи, я думаю, вы спрашиваете, "как я могу записать в 2 таблицы за одну операцию". Наверху я бы, наверное, сказал, что просто выполнил бы 2 записи. Я думаю, что Petapoco будет игнорировать поля, которые не отображаются, поэтому вы можете использовать свой объект грузовика для обеих записей.

Может легко ошибаться, так как я не проверял это.

0 голосов
/ 01 декабря 2011

Я думаю (не проверял), что если бы вы сделали что-то подобное ..

repo.Fetch<Truck>(";Select car.*, truck.maximumload from car left join truck on car.id = truck.carid");

или

repo.Fetch<Truck>(";Select car.*, truck.maximumload from car left join truck on car.id = truck.carid where truck.carid = @0", truckid);

Я бы, скорее всего, назвал бы мой автомобиль базового классамашина, но это только я.

Надеюсь, это поможет?

...