You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Entity Framework模型中用代码-字符串值对替代Enum

实现类似枚举的字符串常量类型(C#)

在C#模型类中使用枚举时,默认会将枚举的整数值存入数据库。我想定义一种类似枚举的类型,既能把短字符串/常量值存储到数据库,又能在代码引用时使用更友好的名称。

比如原本的信用卡服务商枚举定义如下:

public enum CreditCardProvider
{
    Visa = 1,
    [Display(Name ="Master Card")]
    MasterCard = 2,
    [Display(Name ="American Express")]
    AmericanExpress = 3
}

我希望有一个功能类似的对象,但返回的是常量字符串而非整数,示例如下:

public class CreditCardProvider
{
    Visa = "VI",
    [Display(Name ="Master Card")]
    MasterCard = "MC",
    [Display(Name ="American Express")]
    AmericanExpress = "AX"
}

这种需求是否可行?我想在C#模型里用这类类型替代枚举,将VI、MC、AX这类短代码持久化到数据库中。


已实现的解决方案

我已经找到实现方法(比直接用枚举复杂一些),具体代码如下:

定义结构体类型

public struct CreditCardItem {

    public string Code { get; set; }
    public string Name { get; set; }

    public CreditCardItem(string code, string name)
    {
        Code = code;
        Name = name;
    }

    public static CreditCardItem Get(string code)
    {
        return List().Where(_ => _.Code == code).FirstOrDefault();
    }

    public static List<CreditCardItem> List()
    {
        var creditCardItemList = new List<CreditCardItem>() {
        new CreditCardItem("VI", "Visa"),
        new CreditCardItem("MC", "MasterCard"),
        new CreditCardItem("DI", "Diners Card"),
        new CreditCardItem("AX", "American Express")
    };

        return creditCardItemList;
    }
}

EF Core映射配置

在ApplicationDbContext中,通过类型转换将结构体的Code字段与数据库中的字符串值做映射,实现短代码的持久化:

modelBuilder.Entity<PlaygroundModel>()
.Property(ccc => ccc.CreditCardCode)
.HasConversion(ccc => ccc.Code, ccc => CreditCardItem.Get(ccc))
.HasMaxLength(2);

内容的提问来源于stack exchange,提问作者Corey Jensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:17:04