我是实体框架5的新手,我正在尝试枚举支持,但我遇到了一些问题。我使用EF5,因为我使用的是以前的版本,这是创建数据库并从数据库生成模型并使用代码生成。因此,我将模型的代码生成属性更改为“default”,然后删除.tt文件。
我有一个包含多个dll的解决方案,其中一个有DataModel(edmx),另一个有一个名为“EnumGender”的枚举,它有两个值:男性和女性。
在db中,我有一个表,其中有一个名为“Gender”(smallint)的字段,我试图使用“EnumGender”。
EnumGender位于名为“Sample.Datatypes.Enums”的名称空间中,所以在edmx模型浏览器中我试图添加一个Enum。为此,我设置了“EnumGender”作为名称,我没有添加任何值,我选中了“参考外部类型”复选框,我在文本框中输入了“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
{
}
我不知道发生了什么......也许我无法使用外部dll中的数据类型...但是对于我读到的关于枚举支持的内容我应该能够做到这一点......
如果你能帮助我解决这个问题,我将非常感激。
谢谢! 涓
答案 0 :(得分:1)
虽然不是很明显,但这是设计的。 EntityObject模板(将模型的代码生成属性设置为“default”时使用的模板)不使用外部类型,因为它要求类型具有某些属性(EdmEnumTypeAttribute和DataContractAttribute用于枚举)。如果类型本身也由模板生成,则只能可靠地满足此约束。
我强烈建议使用DbContext模板(默认添加的.tt文件),因为它使用POCO类型,因此支持外部类型。
但是,如果您的场景绝对要求您使用EntityObject模板,则可以使用外部枚举类型来更改它:
public string SourceCsdlPath{ get; set; }
并在其前添加此行:
private const string ExternalTypeNameAttributeName = @"http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName";
7。搜索GetSourceSchemaTypes<EnumType>().OrderBy(c => c.Name)
并将其替换为:
GetSourceSchemaTypes<EnumType>()
.Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName))
.OrderBy(c => c.Name)
8。搜索string typeName = MultiSchemaEscape(usage.EdmType, code);
并将其替换为:
string typeName = code.Escape(usage.EdmType.MetadataProperties
.Where(p => p.Name == ExternalTypeNameAttributeName)
.Select(p => (string)p.Value)
.FirstOrDefault())
?? MultiSchemaEscape(usage.EdmType, code);