在域模型中使用枚举值和EF代码优先方法
本文关键字:EF 代码 方法 枚举 模型 | 更新日期: 2023-09-27 18:26:53
我在MVC
应用程序中使用Entity Framework Code First
方法,并且数据库中的每个表都有一些实体类。另一方面,我需要使用一些查找值,即性别,我不想为其创建单独的域模型或表的状态,因此我需要在相关的域模型类或单独的类中定义enum
值。虽然网上有很多样品,但我还没有找到适合EF
和MVC
的。你能提供一个执行此要求的示例用法吗?
注意:我使用MVC5
和EF6
。这是我的实体类Visitor
和示例实体,可以在单独的类(.cs文件)或同一类(.c文件)中定义:
namespace MyProject.Entities
{
public class Visitor
{
[Key]
public int VisitorID { get; set; }
public string VisitorName { get; set; }
//[ForeignKey("ReasonOfVisit")]
public byte ReasonOfVisit { get; set; }
//code omitted for brevity
}
public enum ReasonOfVisit
{
NotSet = 0,
Business meeting = 1,
Periodic visit = 2,
Getting information = 3,
Leaving package = 4
}
}
如果您想在EF模型中使用枚举,您可以尝试以下解决方案:
public class User
{
public string Id { get; set; }
public RegistrationStatus RegistrationStatus { get; set; }
}
public class UserConfiguration : EntityTypeConfiguration<User>
{
public UserConfiguration()
{
this.Property(x => x.RegistrationStatus)
.HasColumnType("int")
.IsRequired();
}
}
public enum RegistrationStatus
{
Pending = 1,
Active = 2,
Blocked = 3
}
当然,它被尽可能简化了。您基本上要做的是将枚举映射到某个基元类型。EF将自动转换值,您可以随心所欲地使用它。
使用实体框架5.0以后的版本,您只需使用您的枚举:
namespace MyProject.Entities
{
public enum ReasonOfVisit
{
NotSet = 0,
For business reason = 1,
For control = 2,
For lefting package = 3,
For leisure = 4
}
public class Visitor
{
...
public ReasonOfVisit ReasonOfVisit { get; set; }
...
}
}
如果您正在使用EF<5.0您可以使用映射到byte/int属性的枚举类型属性
public class Visitor
{
...
public byte ReasonOfVisitAsByte { get; set; }
public ReasonOfVisit ReasonOfVisit { get { return (ReasonOfVisit)ReasonOfVisitAsByte; }
set { ReasonOfVisitAsByte = (byte)value; } }
...
}
p.S。关于您的问题:
枚举值的数据类型是什么
EF最有可能使用int
型
如何在此枚举中定义字符串值
不能直接使用字符串,但如果使用属性并付出一些额外的努力,则可以直接设置枚举返回字符串,而不是其int值。你可以在这里阅读更多关于它的信息