3

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

我正在使用实体框架版本 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();

在调试时,我可以在该上下文中看到“等级”列中的数据

但它既不会在数据库中创建“等级”列,也不会填充其数据。

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

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

1 回答 1

4

您将需要 .NET 4.5

Enum 支持在 .NET 4.0 的 EF 5 中不可用。这是由于 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

.NET4.0 不完全支持 EF 5 是否存在技术原因?

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

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

  • 使用映射器

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

  • 使用 [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指令执行类似的操作。

希望这可以帮助。

于 2013-11-13T07:59:22.280 回答