MVC2, Entity Framework и шаблон хранилища - PullRequest
0 голосов
/ 10 апреля 2011

Я пытаюсь получить шаблон репозитория, работающий с MVC2 и EF.Моя проблема в конкретном хранилище.Когда я пытаюсь привести результаты запроса EF в виде коллекции IEnumerable сущностей модели представления:

Unable to cast object of type     
'System.Data.Objects.ObjectQuery`1[Data_Service.MediaReleases]' 
to type 
    'System.Collections.Generic.IEnumerable`1[TestMVCWithFacory.Models.Entities.MediaReleaseModel]'.

Я чувствую, что это нужно делать с костей, а это с Linq и какотложенное выполнение работает, но я не очень понимаю вуду.

Так что же я там неправильно понимаю и как мне к нему обратиться?

Модель представления:

public class MediaReleaseModel
{
    public string Headline { get; set; }
    public string FullText { get; set; }
}

Интерфейс хранилища:

public interface IMediaReleasesRepository
{
    IEnumerable<MediaReleaseModel> MediaReleases { get;}
}

Бетонное хранилище:

public class MediaReleaseRepository : IMediaReleasesRepository
{
    private NewsEntities DataContext = new NewsEntities();
    private IEnumerable<MediaReleases> _MRs;

    public MediaReleaseRepository()
    {
        _MRs = from art in DataContext.MediaReleases select art;
    }

    public IEnumerable<MediaReleaseModel> MediaReleases
    {
        get { return (IEnumerable<MediaReleaseModel>)_MRs; }
    }

}

Контроллер:

public class HomeController : Controller
{
    private IMediaReleasesRepository _MRRepository;
    public HomeController()
    {
        _MRRepository= new MediaReleaseRepository();
    }

    public ViewResult index()
    {
        return View(_MRRepository.MediaReleases.ToList());
    }

}

1 Ответ

2 голосов
/ 10 апреля 2011

Вы пытаетесь привести коллекцию MediaRelease s к коллекции MediaReleaseModel s. Если MediaReleaseModel является отдельным классом, это не может быть сделано только путем приведения. Как правило, приведение завершится успешно только в одной цепочке наследования или когда определены операторы преобразования , что здесь не так.

Здесь вам нужно переписать поля MediaRelease для объекта модели (это можно автоматизировать с помощью таких инструментов, как AutoMapper ), то есть с помощью LINQ:

public IEnumerable<MediaReleaseModel> MediaReleases
{
    get
    {
        return _MRs.Select(x => new MediaReleaseModel() 
        {
            Prop1 = x.Prop1 
            /* etc. */
        });
    }
}

Одно из предложений: лучше не иметь такой логики в конструкторе, создание объектов должно быть дешевой операцией, и немного странно, когда данные выбираются до того, как они действительно понадобятся.

...