【问题标题】:Why is Entity Framework 5 code-first not mapping my enum property?为什么实体框架 5 代码优先不映射我的枚举属性?
【发布时间】:2017-12-15 16:42:36
【问题描述】:

我有一个使用 EF5MVC3 项目,目标是 ASP.NET framework 4.5,我正在使用一些额外的类对其进行更新。我的一个新类有一个可以为空的嵌套枚举属性,该属性未映射到数据库。

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

以下是一些相关细节:

  • 运行Add-Migration生成的代码不包含该属性。
  • 我创建了其他具有正确映射的 basic 枚举的新类。
  • 我还有其他现有的类具有正确映射的嵌套枚举。
  • 如果我将 basic 枚举放在问题类中,它会正确映射。
  • 如果我将问题枚举放在不同的类中,它也不起作用。

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

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) {...}
  }
}

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

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

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

【问题讨论】:

  • 什么会阻止我的嵌套枚举属性映射到数据库?错误?我所能做的就是确认它在 EF6 中工作,所以如果有错误,它已被修复。
  • 按照 Ivan 所说,在项目副本中升级到 EF6 可能会有所帮助。如果它不起作用,您仍然可以使用原始项目。
  • 原来嵌套与基本枚举是一个红鲱鱼。问题是同名的枚举,由于我在重命名所有内容时测试出错(我在重新运行Add-Migration 时忘记使用-Force 参数所以没有看到更改的映射) .

标签: c# entity-framework-5


【解决方案1】:

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

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

指定的架构无效。错误:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 2012-01-09
    • 2011-08-08
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多