C# EF5中的外部枚举

C# EF5中的外部枚举,c#,entity-framework,C#,Entity Framework,我是EntityFramework5的新手,我正在尝试enum支持,但是我遇到了一些问题。我使用EF5就像我使用以前的版本一样,这是为了创建数据库,从数据库生成模型,并使用代码生成。因此,我将模型的代码生成属性更改为“default”,并删除.tt文件 我有一个包含多个DLL的解决方案,其中一个有DataModel(edmx),另一个有一个名为“EnumGender”的枚举,它有两个值:男性和女性 在数据库中,我有一个表Users,它有一个名为“Gender”(smallint)的字段,我试图使

我是EntityFramework5的新手,我正在尝试enum支持,但是我遇到了一些问题。我使用EF5就像我使用以前的版本一样,这是为了创建数据库,从数据库生成模型,并使用代码生成。因此,我将模型的代码生成属性更改为“default”,并删除.tt文件

我有一个包含多个DLL的解决方案,其中一个有DataModel(edmx),另一个有一个名为“EnumGender”的枚举,它有两个值:男性和女性

在数据库中,我有一个表Users,它有一个名为“Gender”(smallint)的字段,我试图使用“EnumGender”来表示它

EnumGender位于名为“Sample.Datatypes.Enums”的命名空间中,因此在edmx模型浏览器中,我试图添加一个枚举。为此,我将“EnumGender”设置为名称,没有添加任何值,我选中了复选框“Reference external type”,并在文本框中输入了“Sample.Datatypes.Enums.EnumGender”

问题是EF似乎正在数据模型名称空间中创建一个新的枚举,我不希望这样,我希望在“Sample.Datatypes.Enums”名称空间中使用EnumGender。EF创建的新枚举也没有值。。。如果我输入datamodel cs文件(生成的代码),这就是它添加的内容:

/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEnumTypeAttribute(NamespaceName="SampleModel", Name="EnumGender")]
[DataContractAttribute()]
public enum EnumGender : short
{
}
//
///没有可用的元数据文档。
/// 
[EdmEnumTypeAttribute(NamespaceName=“SampleModel”,Name=“EnumGender”)]
[DataContractAttribute()]
公共枚举枚举性别:短
{
}
我不知道发生了什么事。。。也许我不能使用外部dll中的数据类型。。。但就我所读到的有关枚举支持的内容而言,我应该能够做到这一点

如果你能帮我解决这个问题,我将不胜感激

谢谢!
胡安

虽然不明显,但这是有意为之。EntityObject模板(将模型的代码生成属性设置为“默认值”时使用的模板)不使用外部类型,因为它要求类型具有某些属性(用于枚举的EdmEnumTypeAttribute和DataContractAttribute)。只有当类型本身也由模板生成时,才能可靠地满足此约束

我强烈建议使用DbContext模板(默认情况下添加的.tt文件),因为它使用POCO类型,因此支持外部类型

但是,如果您的场景绝对要求您使用EntityObject模板,则有一种方法可以将其更改为使用外部枚举类型:

  • 确保枚举类型与生成的枚举类型具有相同的属性。(是的,这意味着它不能与使用EnityObject生成的其他实体模型共享)
  • 下载并安装EF 5.x EntityObject T4模板: 如果您正在处理web项目,请改用此项目:
  • 在模型的实体设计器视图中的任意位置单击鼠标右键,然后选择“添加代码生成项…”
  • 添加“EF 5.x EntityObject生成器”
  • 打开添加的.tt文件
  • 搜索
    公共字符串SourceCsdlPath{get;set;}
    并在其前面添加此行:
  • 七,。搜索
    GetSourceSchemaTypes().OrderBy(c=>c.Name)
    并将其替换为:

    GetSourceSchemaTypes<EnumType>()
        .Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName))
        .OrderBy(c => c.Name)
    
    string typeName = code.Escape(usage.EdmType.MetadataProperties
                              .Where(p => p.Name == ExternalTypeNameAttributeName)
                              .Select(p => (string)p.Value)
                              .FirstOrDefault())
            ?? MultiSchemaEscape(usage.EdmType, code);
    


    虽然不明显,但这是故意的。EntityObject模板(将模型的代码生成属性设置为“默认值”时使用的模板)不使用外部类型,因为它要求类型具有某些属性(用于枚举的EdmEnumTypeAttribute和DataContractAttribute)。只有当类型本身也由模板生成时,才能可靠地满足此约束

    我强烈建议使用DbContext模板(默认情况下添加的.tt文件),因为它使用POCO类型,因此支持外部类型

    但是,如果您的场景绝对要求您使用EntityObject模板,则有一种方法可以将其更改为使用外部枚举类型:

  • 确保枚举类型与生成的枚举类型具有相同的属性。(是的,这意味着它不能与使用EnityObject生成的其他实体模型共享)
  • 下载并安装EF 5.x EntityObject T4模板: 如果您正在处理web项目,请改用此项目:
  • 在模型的实体设计器视图中的任意位置单击鼠标右键,然后选择“添加代码生成项…”
  • 添加“EF 5.x EntityObject生成器”
  • 打开添加的.tt文件
  • 搜索
    公共字符串SourceCsdlPath{get;set;}
    并在其前面添加此行:
  • 七,。搜索
    GetSourceSchemaTypes().OrderBy(c=>c.Name)
    并将其替换为:

    GetSourceSchemaTypes<EnumType>()
        .Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName))
        .OrderBy(c => c.Name)
    
    string typeName = code.Escape(usage.EdmType.MetadataProperties
                              .Where(p => p.Name == ExternalTypeNameAttributeName)
                              .Select(p => (string)p.Value)
                              .FirstOrDefault())
            ?? MultiSchemaEscape(usage.EdmType, code);