Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 基于视图生成实体框架:可空类型_Entity Framework_Entity Framework 4_Nullable - Fatal编程技术网

Entity framework 基于视图生成实体框架:可空类型

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根

EF生成的类中的某些属性可为null,而某些属性则不可为null

我的第一直觉是,这应该由sp_help MyView返回的null属性驱动。但事实似乎并非如此

sp_help返回为null的某些类型生成为null,而其他类型生成为bool,而不是Nullable*bool*

它是由什么驱动的,有没有办法通过视图来控制它


作为测试,我创建了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视图滚动可空类型,您不需要这样做,因为它已经存在了