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