2010-10-27 56 views
0

由EF生成的類中的某些屬性可爲空,並且某些屬性不是。基於視圖生成實體框架:可空類型

我的第一個直覺是,這應該由sp_help MyView返回的Nullable屬性驅動。但似乎並非如此。

我的一些類型由sp_help將返回可空的獲取生成可爲空,而其他人,獲取生成剛剛bool的而不是可空* BOOL *

什麼是它的驅動,是有什麼辦法控制它的觀點?

作爲一個測試,我創建了ViewA,並比ViewB選擇了ViewA中的所有列。令我驚訝的是,從這些觀點創建的實體並不相同。有些屬性只能在ViewB中爲空。

回答

1

您的預感是正確的,EF基於您的商店架構和視圖創建Nullable屬性並不是一個例外。換句話說,生成的實體對象應該(並且將)準確地反映您的View模式,並且有一種方法可以找到問題:

首先,您需要確保數據庫視圖已正確導入到您的型號:
爲此,裂紋在XML編輯器中打開您的EDM,轉到SSDL內容並找到<EntityType Name="yourDbViewName">再看看<Property Name="yourFieldName" Type="int" Nullable="false" />確保每個領域有Nullable屬性的正確值。由於默認值爲真,EF只會在該字段爲而不是字段時纔會放置此屬性。

從EF4開始,VS2010使用T4模板生成實體對象。鑽進這個T4揭示瞭如何在Nullablity方面正在生成的對象:

private void WritePrimitiveTypeProperty(EdmProperty primitiveProperty, CodeGenerationTools code) 
    { 
     MetadataTools ef = new MetadataTools(this); 
#> 

    /// <summary> 
    /// <#=SummaryComment(primitiveProperty)#> 
    /// </summary><#=LongDescriptionCommentElement(primitiveProperty, 1)#> 
    [EdmScalarPropertyAttribute(EntityKeyProperty=<#=code.CreateLiteral(ef.IsKey(primitiveProperty))#>, IsNullable=<#=code.CreateLiteral(ef.IsNullable(primitiveProperty))#>)] 
    [DataMemberAttribute()] 
    <#=code.SpaceAfter(NewModifier(primitiveProperty))#><#=Accessibility.ForProperty(primitiveProperty)#> <#=code.Escape(primitiveProperty.TypeUsage)#> <#=code.Escape(primitiveProperty)#> 

正如你可以看到EF使用MetadataTools以確定屬性是可空和MetadataTools基本上包含了訪問實體輔助方法代碼生成所需的框架元數據,這意味着它會查看您的EDM以獲取此信息。當然,您可以更改此模板並對其進行自定義,但爲了根據您的數據庫視圖控制Nullable類型,您不需要,因爲它已經在那裏。