Создание Entity Framework на основе представлений: обнуляемые типы - PullRequest
0 голосов
/ 27 октября 2010

Некоторые свойства в классе, сгенерированном EF, могут иметь значение null, а некоторые - нет.

Моим первым инстинктом было то, что это должно управляться свойством Nullable, возвращаемым sp_help MyView.Но, похоже, это не так.

Некоторые из моих типов, которые возвращаются как Nullable с помощью sp_help, генерируются как Nullable, в то время как другие генерируются как просто bool вместо Nullable * bool *

, чем он управляется, и являетсяЕсть ли способ управлять им с помощью представления?

в качестве теста, я создал ViewA, а затем ViewB, который выбрал все столбцы из ViewA.К моему удивлению, сущности, созданные из этих представлений, не были идентичны.Некоторые свойства обнулялись только в ViewB.

1 Ответ

1 голос
/ 27 октября 2010

Ваша догадка верна, EF создает свойства Nullable на основе схемы вашего магазина, и представления не являются исключением из этого. Другими словами, сгенерированный объект сущности должен (и будет) точно отражать вашу схему View, и есть способ, которым вы можете найти проблему:

Прежде всего вам необходимо убедиться, что представление БД было правильно импортировано в вашу модель:
Для этого взломайте вашу EDM в редакторе XML, перейдите к содержимому SSDL и найдите <EntityType Name="yourDbViewName">, а затем посмотрите на <Property Name="yourFieldName" Type="int" Nullable="false" /> и убедитесь, что каждое поле имеет правильное значение для атрибута Nullable. Поскольку значение по умолчанию - true, EF поместит этот атрибут только в том случае, если это поле NOT Null .

Начиная с EF4, VS2010 использует шаблон T4 для генерации объектов Entity. Детализация этого 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 , чтобы определить, имеют ли свойства Nullable, и MetadataTools в основном содержит вспомогательные методы, которые обращаются к метаданным Entity Framework, необходимым для генерации кода, что означает, что он смотрит на ваш EDM, чтобы получить эту информацию. Конечно, вы можете изменить этот шаблон и настроить его, но для управления типами Nullable на основе вашего представления БД вам это не нужно, поскольку он уже существует.

...