繁体   English   中英

EF5中的外部枚举

[英]External Enums in EF5

我是实体框架5的新手,尝试使用枚举支持,但是我对此有一些疑问。 我和以前的版本一样使用EF5,这是创建数据库并从数据库生成模型并使用代码生成。 因此,我将模型的代码生成属性更改为“默认”,并删除了.tt文件。

我有一个包含多个dll的解决方案,其中一个具有DataModel(edmx),另一个具有名为“ EnumGender”的枚举,该枚举具有2个值:male和female。

在数据库中,我有一个表Users,该表具有一个名为“ Gender”(smallint)的字段,并且我尝试为其使用“ EnumGender”。

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

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

/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEnumTypeAttribute(NamespaceName="SampleModel", Name="EnumGender")]
[DataContractAttribute()]
public enum EnumGender : short
{
}

我不知道发生了什么...也许我不能使用来自外部dll的数据类型...但是对于我所读到的枚举支持我应该能够做到这一点...

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

谢谢! 胡安

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

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

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

  1. 确保您的枚举类型具有与生成的枚举类型相同的属性。 (是的,这意味着它不能与使用EnityObject生成的其他实体模型共享)
  2. 下载并安装EF 5.x EntityObject T4模板: http : //visualstudiogallery.msdn.microsoft.com/1da40393-b5ec-404a-a000-6a7e6e911339如果您正在处理Web项目,请改用此项目: http:/ /visualstudiogallery.msdn.microsoft.com/94b48556-fcf0-4b9b-8615-20f9066ae9ac
  3. 右键单击模型的实体设计器视图中的任意位置,然后选择“添加代码生成项...”。
  4. 添加“ EF 5.x EntityObject Generator”
  5. 打开添加的.tt文件
  6. 搜索public string SourceCsdlPath{ get; set; } public string SourceCsdlPath{ get; set; } 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM