2

我已经通过

http://msdn.microsoft.com/en-us/library/microsoft.data.entity.design.extensibility.ientitydesignerextendedproperty(v=vs.103).aspx

这很好用,该属性出现在“属性”对话框中,并保存在 EDMX 文件中。

现在我想在 DDL 生成过程中使用该属性。我已经编辑了 T4 模板文件SSDLToSQL10.tt(位于C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen)。

但是,自定义属性似乎没有出现在元数据树中的任何位置。网站(德文)

http://www.databinding.net/en/blog/post/2010/12/13/entity-framework-4-erweiterte-eigenschaften-in-einer-t4-vorlage-verwenden.html

告诉我扩展属性应该出现在EntityType.MetadataProperties集合中,但是这个集合只包含以下成员:

KeyMembers Members Name NamespaceName Abstract BaseType DataSpace MetadataProperties

这些都不是我的自定义属性。

我错过了什么吗?如何访问IEntityDesignerExtendedPropertyT4 代码生成模板中的 ' 值?

编辑:这是具有自定义属性的 EDMX 部分:

<edmx:ConceptualModels>
  <Schema ...>
    ....
    <EntityType Name="Entity1">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Type="Guid" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="None" />
      <Property Type="String" Name="Name" Nullable="false" />
      <a:MyNewProperty xmlns:a="http://schemas.tempuri.com/MyNewProperty">True</a:MyNewProperty>
    </EntityType>

我想我必须以某种方式将该自定义属性从CSDL映射到SSDL

4

2 回答 2

3

您将属性添加到 CSDL(概念层),而 DDL 是使用 SSDL(存储层)创建的。您应该能够访问 SSDLToSQL10.tt 中的概念模型,但我认为这并不是您真正想要的。一般来说,您的属性不是 EF 运行时可以真正使用的东西 - 我相信它只会被视为扩展并被忽略。如果要添加应该由 EF 运行时使用的属性,则必须在 CSDL(概念层)和 SSDL(存储层)中声明该属性并在 MSL(映射层)中正确映射 - 后者是可能是最困难的。除非我错过了您想要实现的目标,否则您可能使用了错误的扩展点。这IEntityDesignerExtendedProperty允许定义在设计器的属性和模型浏览器窗口中显示但在运行时被忽略的自定义属性。对我来说,您似乎想将属性自动添加到您的模型中。为此,我会尝试使用IModelTransformationExtension,您应该在其中获得可以随意修改的整个 edmx(即 CSDL、SSDL、MSL 并在正确的 EF xml 命名空间中添加元素(属性))。我会尝试使用OnBeforeModelSaved,因为我相信模型会在尝试生成数据库之前自动保存。

于 2013-08-19T17:05:32.537 回答
1

edmx:CopyToSSDL=true我能够使用该属性实现我想要的:

<edmx:ConceptualModels>
  <Schema ...>
    ....
    <EntityType Name="Entity1">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Type="Guid" Name="Id" Nullable="false" annotation:StoreGeneratedPattern="None" />
      <Property Type="String" Name="Name" Nullable="false" />
      <a:MyNewProperty edmx:CopyToSSDL="true"
                       xmlns:a="http://schemas.tempuri.com/MyNewProperty">
          True
      </a:MyNewProperty>
    </EntityType>

这样,SSDL从生成 的转换器CSDL将注释复制到SSDL,因此我可以在生成 DDL SQL 文件的 T4 模板中访问它。

如果有人打算在 Entity Framework 5 中使用它,请不要说存在错误 ( http://entityframework.codeplex.com/workitem/702 ),您可以使用旧的 EDMX XML 命名空间来解决问题:

<a:MyNewProperty edmxv2:CopyToSSDL="true"
                 xmlns:a="http://schemas.tempuri.com/MyNewProperty"
                 xmlns:edmxv2="http://schemas.microsoft.com/ado/2008/10/edmx">
    True
</a:MyNewProperty>
于 2013-08-20T10:30:35.113 回答