Code First Approach的Nullable enum字段不会在数据库中创建枚举字段

时间:2013-11-13 07:24:24

标签: c# entity-framework asp.net-mvc-4 ef-code-first

我使用代码优先方法创建模式,然后在Seed方法的帮助下填充其中的数据

我使用的是Entity Framework 5.0,SQLEXPRESS2008和MVC4

下面是我的模型

  public enum Grade
{
    A, B, C, D, F
}

public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    [DisplayFormat(NullDisplayText = "No grade")]
    public Grade? Grade { get; set; }
    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}

这就是我如何使用Intializer中的种子方法将数据填充到数据库

 var enrollments = new List<Enrollment>
        {
        new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},
        new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},
        new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},
        new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},
        new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},
        new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},
        new Enrollment{StudentID=3,CourseID=1050},
        new Enrollment{StudentID=4,CourseID=1050,},
        new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},
        new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},
        new Enrollment{StudentID=6,CourseID=1045},
        new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},
        };
        enrollments.ForEach(s => context.Enrollments.Add(s));
        context.SaveChanges();

在调试时,我能够看到&#34;等级&#34;该上下文中的列

但它既没有创建专栏&#34;等级&#34;在数据库中也不会填充其数据。

我已在web.config中设置了Context和Database Initalizer,如下所示

   <entityFramework>
  <context type="EntityFrameworkWithMVC.DAL.SchoolContext, EntityFrameworkWithMVC">
    <databaseInitializer type="EntityFrameworkWithMVC.DAL.SchoolInitializer,  EntityFrameworkWithMVC" />
    </context>
   </contexts>
  </entityFramework>

1 个答案:

答案 0 :(得分:3)

您需要.NET 4.5

使用.NET 4.0的EF 5中没有Enum支持。这是由于System.Data.Entity的更改,它不在EF 5库中,而是在.NET 4.5版本中。

请参阅: http://social.msdn.microsoft.com/Forums/en-US/55dc58a4-6190-4bad-b317-1787cf86bf3d/ef-5-but-no-enum-support?forum=adodotnetentityframework

Are there technical reasons EF 5 isn't fully supported on .NET4.0?

您需要一种解决方法来提取enum值(您可以使用int并在映射中转换为enum)或升级到.NET 4.5

[UPDATE] 至于解决方法,有几个选项, 在所有情况下,您都需要将enum值作为stringint(或其他受支持的类型)写入数据库:

  • 使用映射器

如果您正在使用ViewModel或类似的东西,您可以实现一个可配置的映射器,如AutoFac(http://www.nuget.org/packages/Autofac/)。它起初有点难以使用,但它具有IOC,MVC等的所有功能。您可以定义自定义映射定义,以便可以使用ViewModel中的enumint值。你的实体。自定义映射包含从intenum并返回的转换。

  • 使用[NotMapped]列

实施起来更快,但它通常会让你陷入困境:

public int? GradeValue {get;set;}

[NotMapped]
[DisplayFormat(NullDisplayText = "No grade")]
public Grade? Grade 
{ 
    get 
    { 
         return GradeValue.HasValue ? (Grade?) GradeValue.Value : null; 
    } 
}

[NotMapped]属性确保enum未添加到数据库中(如果您决定稍后升级到.NET 4.5,则可能会派上用场。)

现在您可以将该值读作enum。我的猜测是GradeValue需要公开(私有/受保护会给你带来一些好处)(不确定这个版本是否支持)。如果必须是public;它有点棘手,因为其他开发人员可能直接使用这个GradeValue

或者,您可以为set指令执行类似操作。

希望这有帮助。