使用关系构建两个表失败

时间:2017-09-15 15:23:55

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

我正在尝试在Xamarin交叉平台应用程序中构建两个表及它们之间的关系。这是表格的代码:

[Table("DetailTypes")]
public class DetailType
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    public string Detail { get; set; }
}

[Table("DateDetails")]
public class DateDetail
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }

    public int ID_Date { get; set; }

    public string Wert { get; set; }

    public DateTime Datum { get; set; }

    [ForeignKey(typeof(DetailType))]
    public int DetailTypeId { get; set; }

    [OneToOne]
    public DetailType DetailType { get; set; }
}

表格在代码中创建如下:

    public ItemDatabase(string dbPath)
    {
        database = new SQLiteAsyncConnection(dbPath);

        database.CreateTableAsync<DateDetail>().Wait(); //Error is thrown here
        database.CreateTableAsync<DetailType>().Wait(); 
    }

运行代码时,我收到错误“发生未处理的异常”。在标记的行。第一个表是在那时创建的。我做错了什么?

另一个问题:以特定顺序创建表格是否重要,因为它们依赖于彼此?

修改

异常的StackTrace(System.NotSupportedException):

  

在System.Threading.Tasks.Task.ThrowIfExceptional(System.Boolean includeTaskCanceledExceptions)[0x00011] in&lt; 896ad1d315ca4ba7b117efb8dacaedcf&gt;:0 at System.Threading.Tasks.Task.Wait(System.Int32 millisecondsTimeout,System.Threading.CancellationToken cancelToken)[0x00043]在&lt; 896ad1d315ca4ba7b117efb8dacaedcf&gt;:0中的System.Threading.Tasks.Task.Wait()[0x00000] in&lt; 896ad1d315ca4ba7b117efb8dacaedcf&gt ;:0 at .CODE.Data.ItemDatabase..ctor (System.String dbPath)[0x00028]在D:\ CODE_COPY \ EigeneProjekte \ CN _ _Xamarin ********* \ CODE \ Data \ ItemDatabase.cs:22

编辑2: 如果我仔细查看异常,我会发现以下消息:

Don't know about XXX.CODE.Models.DetailType

这是可以理解的,因为此时尚未构建表DetailType。但是我怎么能通过ORM建立关系呢?是否有可能一次创建所有表以确保关系正确且没有表丢失?

2 个答案:

答案 0 :(得分:1)

您可以在single call中制作多个表格 但由于iteates through provided类型和调用分别对每种类型起作用,因此您必须自己定义序列

答案 1 :(得分:1)

所有关系注释都继承自SQLite-Net Ignore属性,因此SQLite-Net的内层忽略了sqlite-net-extensions正确处理的这个属性。如果SQLite-Net无法识别Ignore注释,可能是因为SQLite-Net的安装版本存在冲突的依赖关系。

TL; DR:检查您的依赖项并删除任何重复的SQLite-Net库

根据平台的不同,删除sqlite-net-extensions nuget包可能更容易,只需将源代码复制到项目中即可。