2

有没有办法让从 SQLite.Net 扩展中的同一个父类继承的不同类类型的集合?理想情况下,我希望有一组符合接口或抽象类的对象,但是我什至无法让标准类的子类型工作。

public class ActivityCategory
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Title { get; set; }
    public string Icon { get; set; }
    public bool Recommended { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public SomeAbstractClass[] multipleTypesAllowed { get; set; }
}

public abstract class SomeAbstractClass
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    public string SomeValue { get; set; }

    [ForeignKey(typeof(ActivityCategory))]
    public int ActivityCategoryId { get; set; }

    [ManyToOne(CascadeOperations = CascadeOperation.All)]
    public ActivityCategory Category { get; set; }
}

除了multipleTypesAllowed 的空数组之外,我无法让上述内容返回任何内容。如果我使父类不抽象并实例化它,它会起作用,但即使它的子类也不起作用。有没有办法让 SQLite.Net 继承工作?

干杯。

4

1 回答 1

4

当您使用 GetWithChildren 获取 ActivityCategory 对象时,sqlite-net 在内部使用反射来调用new ActivateCategory()然后new SomeAbstractClass()为每个孩子调用。这就是为什么 sqlite-net 库中的所有泛型都有约束的原因where T : new()。这就是当你的类是抽象类时你得到一个空数组的原因。它只是不能被库实例化。如果你想在同一个数组中存储不同类型的实例,你不能让 sqlite-net 为你猜测它每次应该使用哪种类型。当然,我不知道您的应用程序的逻辑,但我认为您无法避免手动编写查询 - 不使用 sqlite-net 扩展。例如,如果您的基类是 Vehicle,而 Car & Truck 是派生类,您可以使用:

    db.CreateTable<Vehicle>();
    Car c = new Car();
    Truck t = new Truck();
    db.Insert(c, typeof(Vehicle));
    db.Insert(t, typeof(Vehicle));
    ...
    List<Car> cars = db.Query<Car>("select * from Vehicle where VehicleType = ?", VehicleTypes.Car);
    List<Truck> trucks = db.Query<Truck>("select * from Vehicle where VehicleType = ?", VehicleTypes.Truck);

然后,您可以将两个列表合并为一个 Vehicle 列表,并将此列表添加到您的父实例(在您的示例中为 ActivityCategory)。

于 2015-05-05T13:15:59.647 回答