在C#中难以为SQLite形成数据结构

奥根

我正在尝试构建一个非常简单的Xamarin应用程序,其功能类似于“锻炼/日间计划”。SQLite数据库应保存一个“日”表,并且每天应与一个“活动”表相关,它可以查询该天的“活动”表。这些“活动”应为某种类型,为简单起见,我们可以说“步行”,“跑步”或“游泳”。然后,用户应该能够在此数据库上执行基本的CRUD操作,以回想过去的日子及其相关活动。理想情况下,使用SQLiteNetExtensions库,我应该能够进行一个简单的调用来检索数据:

SQLiteAsyncConnection connection = DependencyService.Get<ISQLiteDb>().GetConnection();
var day = await connection.GetWithChildrenAsync<Day>(primaryKey, recursive = true);

型号(简体):

using SQLite;
using SQLiteNetExtensions.Attributes;
using System;
using System.Collections.Generic;

public class Day {

    public Day()
    {
        Date = DateTime.Now;
    }

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

    public DateTime Date { get; set; }

    [OneToMany]
    public List<Activity> Activities { get; set; }
}

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

    [ManyToOne(typeof(Day))]
    public Day Day { get; set; }

    [ForeignKey]
    public int DayRefId { get; set; }

    public double Input { get; set; }

    public virtual double OutputKms { get; set; }
}

public class Walk : Activity 
{
    public override double OutputKms { get { return Input * 3; } }
}

public class Run: Activity 
{
    public override double OutputKms { get { return Input * 5; } }
}

public class Swim: Activity 
{
    public override double OutputKms { get { return Input * 3; } }
}

我正在使用以下代码初始化数据库:

using SQLite;
using Xamarin.Forms;
using SQLiteNetExtensionsAsync.Extensions;    

public async static Task InitDb()
{
    SQLiteAsyncConnection connection = DependencyService.Get<ISQLiteDb>().GetConnection();

    await connection.CreateTableAsync<Day>();
    await connection.CreateTableAsync<Activity>();
    await connection.CreateTableAsync<Walk>();
    await connection.CreateTableAsync<Run>();
    await connection.CreateTableAsync<Swim>();
}

问题在于SQLite不喜欢基于抽象类的表。在尝试创建“活动”表的行上,出现以下编译错误:

错误CS0310“活动”必须是具有公共无参数构造函数的非抽象类型,才能将其用作参数“ T”

我知道在实体框架中支持使用抽象类,但是如果可能的话,我宁愿坚持使用SQLite。

这似乎是一个简单的问题,但对我来说很难解决而不求助于最简单的poco对象和编写大量重复代码。

我的问题是如何更好地重组代码,可以使用哪些库或可以编写哪种映射来实现此目的。感谢任何反馈。谢谢!

伊恩·史密斯

Sqlite.net和Sqlite.net扩展中的所有类型都是T : new()如此,因此您将无法使用抽象类。像这样的代码:

[OneToMany]
public List<Activity> Activities { get; set; }

这里Activity是一个抽象类是行不通的,因为这将是非常困难的工作,出来的数据应该来自哪个表。

它可以构建表ActivityWalkSwimRun(如果您的Activity不是抽象的),但Sqlite.net扩展将无法创建关系,因此将拉不回的数据。

就我个人而言,我不会在要持久化的模型中拥有此属性的逻辑,(您可能已经这样做以简化问题,并且还有更多逻辑):

public override double OutputKms { get { return Input * 3; } }

您可以重构3,5,3 in Walk,,的乘数RunSwim以将其属性化或将活动类型枚举存储在活动类中,而不必使其抽象化,例如:

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

    [ManyToOne(typeof(Day))]
    public Day Day { get; set; }

    [ForeignKey]
    public int DayRefId { get; set; }

    public double Input { get; set; }

    public ActivityType ActivityType { get; set; }
}

public enum ActivityType
{
    Walk,
    Run,
    Swim
}

另一个选择是为数据库创建不同的模型,即Pocos,它们映射到更复杂的应用程序模型。可能使用AutoMapper

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++中的数据结构

来自分类Dev

C#与C:组织数据结构

来自分类Dev

在C中制作共享数据结构

来自分类Dev

c中的指针和数据结构

来自分类Dev

在C中制作共享数据结构

来自分类Dev

在C中搜索递归数据结构

来自分类Dev

SQLite结果集是内存中的数据结构吗?

来自分类Dev

如何将C数据结构转换为C#结构,以允许您从文件中读取数据类型?

来自分类Dev

从C到C#的元数据结构

来自分类Dev

Mongo DB在C#中对具有相同数据结构的集合进行查询

来自分类Dev

在C#中实现通用数据结构时避免游荡

来自分类Dev

JQuery / JavaScript中的C#/ Java的List <Type>数据结构

来自分类Dev

C#数据结构可对特定值进行排序

来自分类Dev

C#中允许O(1)反向的数据结构

来自分类Dev

在JavaScript中使用从C#返回的数据结构

来自分类Dev

用于快速搜索的数据结构是什么?(C#)

来自分类Dev

Rascal中的数据结构

来自分类Dev

Cassandra 中的数据结构

来自分类Dev

C ++多态数据结构

来自分类Dev

C ++数据结构声明

来自分类Dev

C ++正确的数据结构

来自分类Dev

在C#中从数据库自动生成数字

来自分类Dev

哪些数据结构和算法无法在C中实现?

来自分类Dev

在Qt C ++中从mysql创建动态数据结构

来自分类Dev

使用调用堆栈在C中实现堆栈数据结构?

来自分类Dev

在C中创建递归数据结构的方法

来自分类Dev

在C ++中实现回调矩阵的数据结构

来自分类Dev

C中的数据结构-在列表的开头插入节点

来自分类Dev

如何理解这个指向C中数据结构的指针?