如何设置A - > B - >使用SQLite-Net Extensions的C关系

时间:2014-11-05 04:04:59

标签: c# sqlite mvvmcross sqlite-net-extensions

我使用MVVMCross和SQLite-Net Extensions包来完成以下任务:

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

    public string Description { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]      // One to many relationship with Valuation
    public List<Stock> Stocks { get; set; }
}

public class Stock : IList<Valuation>
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    [MaxLength(8)]
    public string Symbol { get; set; }

    [ForeignKey(typeof(StockGrouping))]
    public int StockGroupingId { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]      // One to many relationship with Valuation
    public List<Valuation> Valuations { get; set; }
#region IList implementation
#endregion
}

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

    [ForeignKey(typeof(Stock))]     // Specify the foreign key
    public int StockId { get; set; }
    public DateTime Time { get; set; }
    public decimal Price { get; set; }

    [ManyToOne]      // Many to one relationship with Stock
    public Stock Stock { get; set; }
}

基本上我有一个整体结构,我有一组股票类别,其股票有估值。

我正在设想使用iOS分组表视图将股票分组到特定类别下。

使用SQLite-Net Extensions可以进行这种设置吗?

此时我在创建SQLite表时遇到异常:

    private void CreateDataBase()
    {
        sqLiteConnection.CreateTable<Stock>();
        sqLiteConnection.CreateTable<StockGrouping>();
        sqLiteConnection.CreateTable<Valuation>();
    }

它在sqLiteConnection.CreateTable()行上失败,说它不了解StockGrouping。

有什么想法吗?这甚至可以吗?

1 个答案:

答案 0 :(得分:2)

似乎SQLite-Net不支持从IList继承的对象。更改Stock定义:

public class Stock : IList<Valuation>

public class Stock

让它在我的测试中发挥作用。

您也可以继承IEnumerable而不是IList,并且有效:

public class Stock : IEnumerable<Valuation>
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    [MaxLength(8)]
    public string Symbol { get; set; }

    [ForeignKey(typeof(StockGrouping))]
    public int StockGroupingId { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]      // One to many relationship with Valuation
    public List<Valuation> Valuations { get; set; }


    public IEnumerator<Valuation> GetEnumerator() {
        return Valuations.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
        return Valuations.GetEnumerator();
    }
}