2013-08-17 23 views
2

我已經通過實體框架設計自定義屬性不會出現在DDL代

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

這種運作良好,增加了自定義屬性的實體框架5設計師的屬性對話框中,屬性顯示在屬性對話框並保存在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 

這些都不是我的自定義屬性。

我錯過了什麼嗎?如何在T4代碼生成模板中訪問IEntityDesignerExtendedProperty的值?

編輯:這裏是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莫名其妙。

+1

你能顯示你的EDMX在添加屬性後(即添加屬性的部分/實體/複合類型應該足夠)? – Pawel

+0

完成,請參閱編輯。 – cheeesus

回答

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> 

這樣,產生從CSDL副本註釋移交給SSDLSSDL的transformator,所以我能在生成DDL SQL文件的T4模板中訪問它。

如果有人要在實體框架5使用此,請不就是有一個bug(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> 
3

您在使用SSDL(存儲層)創建DDL時將屬性添加到CSDL(概念層)。你應該能夠訪問SSDLToSQL10.tt中的概念模型,但我不認爲它真的是你以後的樣子。一般而言,你的屬性不是EF運行時真正可以使用的東西 - 我相信它只會被當作擴展並被忽略。如果你想添加一個本應該由EF運行時使用的屬性,那麼這個屬性必須在CSDL(概念層)和SSDL(存儲層)中聲明並且在MSL(映射層)中正確映射 - 後者是可能是最困難的。 除非我錯過了你想要達到的目標,否則可能會使用錯誤的擴展點。 IEntityDesignerExtendedProperty允許定義在設計器中的屬性和模型瀏覽器窗口中顯示的自定義屬性,但在運行時會被忽略。對我來說,它看起來像你想自動添加一個屬性到你的模型。爲此,我會嘗試使用IModelTransformationExtension,您應該在其中爲您提供可以隨意修改的整個edmx(即CSDL,SSDL,MSL以及在正確的EF xml名稱空間中添加元素(屬性))。我會嘗試使用OnBeforeModelSaved,因爲我相信在生成數據庫之前將自動保存模型。