【问题标题】:How can I bind an Enum to a DbType of bit or int?如何将 Enum 绑定到位或 int 的 DbType?
【发布时间】:2013-08-21 19:28:30
【问题描述】:

我正在使用 Linq2Sql 并希望将对象字段(即枚举)绑定到数据库中的位或 int 类型。例如,我想在我的模型中有一个性别字段。我已经编辑了 DBML 并将类型更改为指向我的枚举。我想使用相同的想法为性别和其他区域的下拉列表创建单选按钮(我想我已经弄清楚了)。我的枚举看起来像这样

public enum Gender
{
    Male,
    Female
}

Mapping between DbType 'int' and Type 'Project.Models.Gender' in Column 'Gender' of Type 'Candidate' is not supported.

关于如何进行此映射的任何想法。我是否遗漏了枚举中的某些内容。

【问题讨论】:

    标签: asp.net-mvc linq-to-sql


    【解决方案1】:

    如果你有这样的int 枚举:

    public enum Gender
    {
        Male = 0,
        Female
    }
    

    和int 列在您的数据库中,下一个映射应该没有问题。

    <Column Name="Gender" Type="global::Project.Models.Gender" DbType="Int NOT NULL"
            CanBeNull="false" />
    

    global:: 关键字可能是这里的关键。如果没有它,我在将整数数据类型映射到枚举时遇到了一些问题。

    【讨论】:

    • 我还从另一篇文章中添加了 global::,构建问题已经消失,现在它可以正确保存到数据库中。我的下一个问题是当我进行 linq 选择时。它给了我无效的演员表例外。我不确定它是否与我使用的枚举有关。 DbType 是否必须为非 null?
    • @uriDium:我没有在 LINQ 中使用可为空的枚举,但假设它应该可以工作:设置 DbType="Int" 和 CanBeNull="true"。
    • 好的,我又试了一遍。也许有些东西弄糊涂了。我将表格重新拖入设计器中,再次更改类型,然后一切正常。我认为 global:: bus 应该被整理出来。可能不会。谢谢
    • Alex,您是否必须手动修改 DBML 才能执行此操作?当有人在 DBML 设计器中刷新对象时会发生什么?你的改变会被抹去吗?
    • @Robert Harvey:是的,我在上一个项目中手动对模型进行了大部分更改。问题是:项目正在扩展,随着项目的数据层也在扩展。我必须经常向数据库添加新字段。对我来说,使用设计师这样做不太舒服。还有一件事:设计师很麻烦(我前段时间尝试添加 2 个表,但尝试不成功)。但令人高兴的是,我是唯一一个使用数据/BLL 的人。
    【解决方案2】:

    我发现

    Type="System.Boolean" DbType="bit" CanBeNull="true"
    

    计算出该类型应该是可空的[布尔型],对于枚举,我必须将类型指定为可空类型..

    Type="WhatNextEnum?" DbType="int" CanBeNull="true"
    

    如果你不这样做,你会得到“DBML1005:不支持 DbType 'int' 和 Type 'WhatNextEnum' 之间的映射......”。错误

    【讨论】:

    • 感谢您发布此信息。我遇到了这个确切的问题。
    猜你喜欢
    • 2012-01-26
    • 2014-01-09
    • 1970-01-01
    • 2011-03-29
    • 2010-09-08
    • 2011-07-06
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    相关资源
    最近更新 更多