Представление SQL Server 2008 и Entity Framework 4 - PullRequest
1 голос
/ 16 декабря 2011

Я использую EF4 для извлечения объектов базы данных.Я определил представление, которое суммирует информацию о пользователях.

В SSMS я получаю 8 различных результатов, используя select * или хранимую процедуру.Пример:

enter image description here

При запросе в EF4 мое представление возвращает 8 результатов, но свойство UserTeamName всегда возвращается в качестве первого значения (BoboTeam).Это странно, потому что UserRole возвращается правильно, разница между этими элементами заключается в том, что UserTeamName может иметь значение null.

Это похоже на проблему с EF, поскольку объект заполняется методом ExecuteFunction изSystem.Data.Objects.ObjectContext:

public ObjectResult<MySecurityView> SecurityList(Nullable<global::System.Int32> userId)
    {
        ObjectParameter userIdParameter;
        if (userId.HasValue)
        {
            userIdParameter = new ObjectParameter("userId", userId);
        }
        else
        {
            userIdParameter = new ObjectParameter("userId", typeof(global::System.Int32));
        }

        return base.ExecuteFunction<MySecurityView>("SecurityList", userIdParameter);
    }

Тот же результат, когда мы используем запрос linqtosql вместо хранимой процедуры.Любая подсказка приветствуется.

1 Ответ

3 голосов
/ 16 декабря 2011

EF требует, чтобы каждая возвращаемая запись была однозначно идентифицируемой.Когда вы добавляете представление SQL в модель сущностей, оно по умолчанию берет все необнуляемые столбцы и определяет их как ключ.Так что в вашем случае он выбрал UserRole и UserId в качестве ключа сущности.

Другое внутреннее правило EF может отслеживать каждый ключ объекта только один раз.Поэтому, когда он загружает запись с Role = Manager и Id = 1, он добавляет ее к своей внутренней карте идентичности.Как только он снова загружает запись с тем же ключом, он не будет создавать новый экземпляр сущности, а будет использовать уже загруженный (который имеет TeamName = Bobo Team).Вот почему у вас есть все названия команд, установленные для команды Бобо.Используется только первая запись в паре.

Попробуйте вручную настроить ключ объекта в EDMX, чтобы задействовать UserTeamName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...