我有这些课程:
class Car {
int ID;
string Name;
}
class Truck : Car {
int MaximumLoad;
}
我有这些桌子
Car
- ID
- Name
Truck
- CarID
- MaximumLoad
如何使用 PetaPoco 将我的课程与我的表映射?
如果您将 Car 和 Truck 存储在同一个表 ( TPH ) 中,您可以从 Car 继承 Truck,只需对 PetaPOCO 源代码进行少量更改,
表车辆(ID、鉴别器、名称、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); }
//...
}
要读取卡车记录,我将创建一个合并两个表的卡车视图。或者看看 Schotime 的多个结果集:
http://schotime.net/blog/index.php/2011/11/20/petapoco-multiple-result-sets/
对于写入,我猜您是在问“如何在一次操作中写入 2 个表”。在我的脑海中,我可能会说我只会执行 2 次写入。我认为 Petapoco 会忽略不映射的字段,因此您可以使用您的卡车对象进行两次写入。
可能很容易出错,因为我没有对此进行测试。
我认为(虽然没有测试过)如果你做这样的事情..
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);
我可能会称我的基础类车辆而不是汽车,但这只是我。
希望有帮助吗?