【问题标题】:Dapper enum mapping简洁的枚举映射
【发布时间】:2021-05-07 23:14:31
【问题描述】:

我需要帮助以使用 Dapper 和 Oracle 映射枚举。

我在 Oracle 类型 NUMBER (1) 中有一个字段,并且必须在我的实体中变成一个枚举。

public Status Status { get; set; }

状态是一个枚举:

public enum Status
{
    [Description("Inactive", "0")]
    Inactive = 0,

    [Description("Active", "1")]
    Active = 1,
 }

如何使用 Dapper 进行映射?

【问题讨论】:

  • Dapper 会自动执行此操作,只需确保您的查询返回与实体类中的 Status 属性同名的数字字段

标签: .net dapper


【解决方案1】:

枚举应该 JustWork™ 用于整数或字符串表示。如果它不起作用,您必须更具体地了解它抛出的任何异常。例如,大声思考和纯粹的推测,但是:IIRC Oracle 习惯于将数字视为 64 位,我想知道枚举映射代码是否可以处理所有类型的数字转换。如果没有,那就是一个错误。

那么:它有效吗?

【讨论】:

  • 不是为了劫持线程,而是说真的,伙计,你能写一篇关于你是如何让你的声誉如此之高的文章吗?我进来寻找答案并碰巧注意到了这一点,这是我一直在努力解决的问题。
  • @KevinBBurns 多年来一直在回答问题 :)
  • 重新“枚举应该只是工作”。我正在努力做到这一点。只是一个标准的枚举定义,试图插入到字段定义为 INT(11) 的 mysql 表中。不断收到一条 SQL 错误,告诉我该字段不能为 NULL。所以 Dapper 将我的枚举映射到 null 而不是 int?
  • @ScottTx 你有例子吗?
  • 关于进一步测试.. 我的问题不是 ENUM 问题。我在课堂上切换到 int 数据类型并遇到了同样的问题。我使用的是 Devart MySql 驱动程序。我切换到使用从 github 下载的 MySqlConnector 异步驱动程序,一切都开始工作了。 enum 和 int 都有。所以.. Devart 提供商肯定有问题。但是我对 MySqlConnector 没问题,所以我的问题解决了。
【解决方案2】:

只是为了明确其他答案中的合理建议。您的数据库可能将数据存储在名为 StatusId 的列中,而您对象的属性可能只是 Status

我通常通过在 SQL 查询中使用别名来解决这个问题:

SELECT StatusId AS Status FROM Table

Dapper 隐式理解如何将 int 数据库字段映射到 C# 枚举。我通常给我的枚举明确的值以使事情尽可能清晰,例如

public enum Status
{
   Active = 1,
   Inactive = 2
}

【讨论】:

  • 你的实体有一个枚举状态属性?也适用于插入更新?
【解决方案3】:

在使用 dapper 时,我无法让可为空的枚举工作。

为了解决这个问题,我创建了两个类:一个对象模型和一个 SQL 模型。

SQL 模型是对象模型的简单版本,枚举作为字符串保存在数据库中。对象模型有一个以 SQL 模型作为输入的构造函数。

class ThingSQLModel
{
    public int? Id;

    public String? ThingType;

 ....


}

class Thing
{
    public int? Id;

    public EnumThingType? ThingType{ get; set; }

 ....

    public Thing(ThingSQLModel)
    {
        Id = output.Id;

        ThingType= EnumHelper.TryParseNullable<EnumThingType>(output.ThingType);
    }
}

对于TryParseNullable&lt;EnumThingType&gt;,请参阅: Parsing value into nullable enumeration

也许通过显式覆盖这种类型的默认解析有更好的方法?唔。我会尝试并给出答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多