【问题标题】:Sqlite-net create two tables from the same classSqlite-net 从同一个类创建两个表
【发布时间】:2015-01-01 00:49:48
【问题描述】:

Sqlite-net 的文档说您可以使用库中可用的 ORM 创建一个表,方法是使用如下泛型:

await connection.creatTableAsync<myClass>();

这将在数据库中生成一个名为myClass 的表

现在假设我需要另一个表来存储相同类型 (myClass) 但在具有不同名称的不同表中 (例如myOtherClassTable)。

如何做到这一点,使用 Sqlite-net 库?

【问题讨论】:

    标签: c# sqlite sqlite-net


    【解决方案1】:

    现在假设我需要另一个表来存储相同的类型 (myClass) 但在不同名称的不同表中

    你不能这样做。

    Table 方法要求存在同名的表 返回的类型。

    它是一个简单的 ORM,并不关心您对其施加的任何人为限制。它根据类型名称跟踪使用的表,因此在处理查找表之前需要另一层间接层才能看到某个类型被映射到多个表。

    如果我想为 myClass 对象检索数据库中的所有行,它应该从 myClass 表和 myOtherClassTable 中返回行吗?你需要开始编写更多的 ORM 功能来提供选项并弄清楚所有这些,这正是让你进入严肃的 ORM 领域的东西。

    根据您所有属性的可见性,您可以创建一个子类类型,它实际上不实现任何新功能,但只是具有不同的类名或使用通用 IMyClass 接口,实际上有两个不同的类以不同的方式实现接口名称但相同的实现。

    这些 OO 解决方案都不是真正理想的,如果可能,您应该考虑向您的类对象添加另一个属性,您将根据这些属性进行过滤以确定您将哪些项目放置到 2 个单独的表中。

    【讨论】:

    • 你给了我一个有趣的技巧!我创建另一个类,它是myClass 的副本,并将其命名为myOtherClass 并创建该表。但我需要在 VS 测试项目上对其进行测试,看看我是否可以读取 'List` 上的两个表。我将在测试后更新
    • 我的测试失败 :( 因为你不能设置 `List theList = List();`
    【解决方案2】:

    API 只为您提供 2 个选项:int CreateTable&lt;T&gt;(CreateFlags createFlags = CreateFlags.None)int CreateTable(Type ty, CreateFlags createFlags = CreateFlags.None),它们都会创建一个以您的类型名称命名的表,这不是您想要的。

    你可以做的是自己创建表:

    connection.Execute("CREATE TABLE [myOtherTable] (Column1 int, Column2 ...");
    

    但是,正如@nvuono 已经说过的,这可能会给您带来其他麻烦;)

    【讨论】:

    • github.com/praeclarum/sqlite-net/tree/master/src有两个文件(Sqlite.cs和SqliteAsync.cs)
    • 谢谢@stackunderflow,我会把番茄从我的眼睛里拿走 :)
    • 如果我想使用 sql 语言语法,那么我会选择 Sqlite PCL sqlitepcl.codeplex.com,无论如何谢谢你:) 我喜欢 OOP 方法和 ORM(我是 EF 的忠实粉丝和linq)
    • 我也喜欢微 ORM。你可以再看看dapper.net
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多