如何用petapoco映射儿童/父母班级? [英] How to map childs/parent class with petapoco?

查看:78
本文介绍了如何用petapoco映射儿童/父母班级?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这些课程:

class Car {
    int ID;
    string Name;
}

class Truck : Car {
    int MaximumLoad;
}

我有这些桌子

Car
- ID
- Name

Truck
- CarID
- MaximumLoad

如何使用PetaPoco将我的班级与桌子映射?

How could I map my classes with my table using PetaPoco ?

推荐答案

如果将汽车和卡车存储在同一表格中(

If you store Car and Truck in the same table (TPH) you can inherit Truck from Car with minor changes to PetaPOCO source code,

桌式车辆(ID,鉴别器,名称,最大负载)

table Vehicle (ID, Discriminator, Name, MaximumLoad)

在PetaPOCO.cs中,添加

in PetaPOCO.cs, add

[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中,您可以编写/生成这样的代码,

Then in your Car.cs and Truck.cs, you can write/generate code like this,

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); }
    //...
}

这篇关于如何用petapoco映射儿童/父母班级?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆