【问题标题】:Building two tables with relation fails建立两个有关系的表失败
【发布时间】:2017-09-15 15:23:54
【问题描述】:

我正在尝试在 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 :0 在 System.Threading.Tasks.Task.Wait (System.Int32 毫秒超时,System.Threading.CancellationToken cancelToken ) [0x00043] in :0 at System.Threading.Tasks.Task.Wait () [0x00000] in :0 at .CODE.Data.ItemDatabase..ctor (System. String dbPath) [0x00028] in D:\CODE_COPY\EigeneProjekte\CN__Xamarin*********\CODE\Data\ItemDatabase.cs:22

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

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

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

【问题讨论】:

  • 使用 try/catch 获取实际异常
  • 该异常是否有原因?因为它没有说任何有用的东西
  • @redent84 很抱歉我的回答迟了,感谢您提供帮助。我已经更新了我的问题,你能看看吗?谢谢:-)

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


【解决方案1】:

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

TL;DR:检查您的依赖关系并删除所有重复的 SQLite-Net 库

根据平台,删除 sqlite-net-extensions nuget 包并简单地将源代码复制到项目中可能更容易。

【讨论】:

  • 谢谢,有帮助。
【解决方案2】:

您可以在single call 中创建多个表 但是由于它iteates through provided 分别为每种类型键入和调用函数,因此您必须自己定义序列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多