我使用代码优先方法创建模式,然后在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>
答案 0 :(得分:3)
您需要.NET 4.5
使用.NET 4.0的EF 5中没有Enum支持。这是由于System.Data.Entity的更改,它不在EF 5库中,而是在.NET 4.5版本中。
Are there technical reasons EF 5 isn't fully supported on .NET4.0?
您需要一种解决方法来提取enum
值(您可以使用int
并在映射中转换为enum
)或升级到.NET 4.5
[UPDATE]
至于解决方法,有几个选项,
在所有情况下,您都需要将enum
值作为string
或int
(或其他受支持的类型)写入数据库:
如果您正在使用ViewModel或类似的东西,您可以实现一个可配置的映射器,如AutoFac(http://www.nuget.org/packages/Autofac/)。它起初有点难以使用,但它具有IOC,MVC等的所有功能。您可以定义自定义映射定义,以便可以使用ViewModel中的enum
和int
值。你的实体。自定义映射包含从int
到enum
并返回的转换。
实施起来更快,但它通常会让你陷入困境:
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
指令执行类似操作。
希望这有帮助。