如何在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
相关产品推荐
相关产品推荐

