Entity framework 基于视图生成实体框架:可空类型
EF生成的类中的某些属性可为null,而某些属性则不可为null 我的第一直觉是,这应该由sp_help MyView返回的null属性驱动。但事实似乎并非如此 sp_help返回为null的某些类型生成为null,而其他类型生成为bool,而不是Nullable*bool* 它是由什么驱动的,有没有办法通过视图来控制它Entity framework 基于视图生成实体框架:可空类型,entity-framework,entity-framework-4,nullable,Entity Framework,Entity Framework 4,Nullable,EF生成的类中的某些属性可为null,而某些属性则不可为null 我的第一直觉是,这应该由sp_help MyView返回的null属性驱动。但事实似乎并非如此 sp_help返回为null的某些类型生成为null,而其他类型生成为bool,而不是Nullable*bool* 它是由什么驱动的,有没有办法通过视图来控制它 作为测试,我创建了ViewA和ViewB,并从ViewA中选择了所有列。令我惊讶的是,从这些视图创建的实体并不完全相同。某些属性只能在ViewB中为空 您的直觉是正确的,EF根
作为测试,我创建了ViewA和ViewB,并从ViewA中选择了所有列。令我惊讶的是,从这些视图创建的实体并不完全相同。某些属性只能在ViewB中为空 您的直觉是正确的,EF根据您的存储架构和视图创建可为空的属性也不例外。换句话说,生成的实体对象应该(并且将)准确反映您的视图模式,并且有一种方法可以找到问题:
首先,您需要确保DB视图已正确导入到您的模型中:
为此,请在XML编辑器中打开EDM,转到SSDL内容并找到
,然后查看
,确保每个字段都具有可为null
属性的正确值。由于默认值为true,因此EF仅在该属性为NOTNULL字段时才会放置该属性。
从EF4开始,VS2010使用T4模板生成实体对象。钻取该T4可以揭示如何根据空性生成对象:
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)#>
private void WritePrimitiveTypeProperty(EdmProperty primitiveProperty,CodeGenerationTools代码)
{
MetadataTools ef=新的MetadataTools(此);
#>
///
///
///
[EdmScalarPropertyAttribute(EntityKeyProperty=,IsNullable=)]
[DataMemberAttribute()]
正如您所见,EF使用MetadataTools来确定属性是否为空,MetadataTools基本上包含访问代码生成所需的实体框架元数据的帮助器方法,这意味着它会查看您的EDM以获取此信息。当然,您可以更改此模板并对其进行自定义,但出于继续的目的基于DB视图滚动可空类型,您不需要这样做,因为它已经存在了