您的預感是正確的,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類型,您不需要,因爲它已經在那裏。