为什么Entity Framework 5代码优先不映射我的枚举属性?

时间:2017-12-15 16:42:37

标签: c# entity-framework-5

我有 MVC3 项目使用 EF5 定位 ASP.NET framework 4.5 ,我正在使用其他一些类进行更新。我的一个新类具有可空的嵌套枚举属性,该属性未映射到数据库。

public class MyProblemClass
{
  public MyClass.MyEnum? MyPropertyName { get; set; }
}

以下是一些相关细节:

  • 通过运行Add-Migration生成的代码不包含此属性。
  • 我已经使用正确映射的基本枚举创建了其他新类。
  • 我还有其他现有的类,其中包含正确映射的嵌套枚举。
  • 如果我在问题类中放置基本枚举,则它会正确映射。
  • 如果我将问题枚举放在另一个班级,那么它也不会在那里工作。

基本枚举是指在类之外定义的那些:

namespace My.Project.NewStuff
{
  public enum MyEnum
  {
    Option1,
    Option2
  }
}

嵌套枚举是指在类中定义的枚举:

namespace My.Project.NewStuff
{
  public static class MyClass
  {
    public enum MyEnum
    {
      Option1,
      Option2
    }
    public static string MyExtensionMethod (this MyEnum option) {...}
  }
}

新的枚举和类名实际上与现有的名称相同,但在不同的名称空间中。新的选项略有不同,扩展方法中的代码不同。

我尝试稍微重命名类,枚举和属性以查看是否存在与使用相同名称相关的任何错误,但这并没有帮助。

什么可能阻止我的嵌套枚举属性被映射到数据库?

1 个答案:

答案 0 :(得分:0)

解决方案:将枚举重命名为唯一的。根据this SO answer,实体框架不支持具有相同非限定名称的多个类。这似乎包括枚举。

通常,您会在Add-Migration步骤中收到与以下内容类似的错误:

  

指定的架构无效。错误:

     

CLR类型到EDM类型的映射是不明确的,因为多个CLR类型与EDM类型“MyEnum”匹配。

但是,如果冲突类型中的枚举数不相同,则Add-Migration不会显示此错误,只会生成省略映射冲突类型的任何属性的迁移。使冲突类型中的枚举器相同将再次显示错误。