Entity Framework Code First: Как я могу привести набор сущностей, возвращаемых из базы данных? - PullRequest
3 голосов
/ 01 марта 2011

Я пытаюсь выяснить, почему это не работает ...

DomainModel

public class ModelEntities : DbContext
{
    public DbSet<Address> Addresses { get; set; }
}

Контроллер

public ViewResult List(int id)
{
    var db = new ModelEntities();
    var addresses = db.Addresses.Where(x => x.CustomerID == id).AsEnumerable();
    return View(entities.Cast<AddressVM>());
}

View

@model IEnumerable<WebUI.Models.AddressVM>
...

AddressVM

public class AddressVM
{
    public AddressVM(Address address) { Bind(address); }

    private void Bind(Address address)
    {
        // Mapping logic is defined here
    }

    public static explicit operator AddressVM(Address address)
    {
        return new AddressVM(address);
    }
}

Теперь, если я поменяю представление на IEnumerable<DomainModel.Models.Address> и не выполняю приведение, все будет работать, как и ожидалось.

Когда я пытаюсь выполнить приведение, я получаю следующую ошибку:

Невозможно привести объект типа 'System.Data.Entity.DynamicProxies.Address_37444C79F0AB1E0A599C8797F37448F12213C5BCAC0611B4C1C8EFADDEFAA82C', чтобы ввести 'WebUI.Models.AddressVM'.

Почему в контроллере addresses это набор динамических прокси даже после вызова AsEnumerable()? Что мне нужно сделать, чтобы получить коллекцию объектов моей доменной модели, чтобы я мог привести их к модели представления?

Ответы [ 2 ]

4 голосов
/ 01 марта 2011

Бьюсь об заклад, ваше недопонимание концепции броска.Приведение означает, что экземпляр AddressVM является экземпляром Address ... что я предполагаю, что это не так.Возможно, вам придется «преобразовать» или создать экземпляр объекта AddressVM из объекта Address.попробуйте это:

public ViewResult List(int id)
{
    var db = new ModelEntities();
    var addresses = from a in db.Addresses.Where(x => x.CustomerID == id)
                    select new AddressVM(a);
    return View(addresses );
}

[править] Согласно ответу Брайана , вы можете разыграть объект, если существует неявное преобразование между вашим фактическим типом и целевым типом.

2 голосов
/ 01 марта 2011

Вам нужно установить явный оператор на вашем AddressVM, если вы хотите иметь возможность навести Address на него.Вы можете взглянуть на AutoMapper, если хотите довольно легко переместить данные из модели предметной области в модель представления.

...