Почему LINQ to Entities не позволяет мне инициализировать только некоторые свойства Entity? - PullRequest
0 голосов
/ 29 апреля 2010

Итак, я начал добавлять Entity Framework 4 в устаревшее веб-приложение (ASP.NET WebForms).

Для начала я автоматически сгенерировал некоторые объекты из базы данных. Также я хочу применить Repository Pattern.

Существует сущность с именем Visitor и ее хранилище VisitorRepository

В VisitorRepository у меня есть следующий метод:

public IEnumerable<Visitor> GetActiveVisitors()
{
    var visitors = 
        from v in _context.Visitors
        where v.IsActive
        select new Visitor
        {
            VisitorID = v.VisitorID,
            EmailAddress = v.EmailAddress,
            RegisterDate = v.RegisterDate,
            Company = v.Company,
            Position = v.Position,
            FirstName = v.FirstName,
            LastName = v.LastName
        };

    return visitors.ToList();
}

Обратите внимание, что у посетителя больше свойств, чем у меня, я просто не хочу получать все, потому что есть несколько тяжелых текстовых полей.

Этот список затем привязывается к повторителю, и при попытке сделать <%# Eval('EmailAddress') #%> он выдает следующее исключение.

The entity or complex type 'Model.Visitor' cannot be constructed in a LINQ to Entities query.

А) Почему это происходит? Как я могу обойти это? Нужно ли мне выбирать анонимный тип, а затем использовать его для частичной инициализации моих объектов ??? Я не хочу делать SELECT *, потому что здесь есть несколько тяжелых текстовых столбцов, которые мне здесь не нужны

B) Почему каждый пример, который я видел, использует «select new» (анонимный объект) вместо инициализации известного типа? Анонимные типы бесполезны, если вы не извлекаете данные и не отображаете их в одном слое. Насколько я знаю, анонимные типы не могут быть возвращены из методов? Так в чем же их смысл ???

Спасибо всем

1 Ответ

1 голос
/ 29 апреля 2010

а) Это происходит потому, что Посетитель - это сущность. Вы можете сказать следующее с пониманием, что вы не сможете обновить базу данных с помощью результирующих объектов вне контекста данных в хранилище:

var visitors = 
    from v in _context.Visitors
    where v.IsActive
    select v;

б) Я не знаю, на какой пример вы смотрите, но вы правы, когда говорите, что передача коллекции анонимных типов из хранилища на уровне данных в GUI - не то, что вам нужно. Вы можете использовать объекты самоконтроля или объекты передачи данных (DTO). В этой статье MSDN подробно описываются ваши варианты.

...