gpt4 book ai didi

c# - 在 C# 中为 SQLite 形成数据结构时遇到问题

转载 作者:行者123 更新时间:2023-12-02 00:03:13 58 4
gpt4 key购买 nike

我正在尝试构建一个非常简单的 Xamarin 应用程序,其功能类似于锻炼/日程计划器。 SQLite数据库应该保存一个“Day”表,并且每一天都应该与一个“Activity”表相关,它可以查询当天的“Activity”表。这些“事件”应该属于某种类型,为简单起见,我们可以说“步行”、“运行”或“游泳”。然后,用户应该能够在此数据库上执行基本的 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 不喜欢基于抽象类的表。在我尝试创建“事件”表的行上,出现以下编译错误:

Error CS0310 'Activity' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T'

我知道 Entity Framework 支持使用抽象类,但如果可能的话,我宁愿坚持使用 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; } }

您可以将 WalkRunSwim 中的 3、5、3 的乘数重构为属性或存储事件类中的事件类型枚举,而不是使其抽象为:

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

关于c# - 在 C# 中为 SQLite 形成数据结构时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59315346/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com