您的预感是正确的,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类型,您不需要,因为它已经在那里。