2010-10-27 96 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类型,您不需要,因为它已经在那里。