簡體   English   中英

實體框架代碼優先:如何轉換從數據庫返回的一組實體?

[英]Entity Framework Code First: How can I cast a set of entities returned from the database?

我想弄清楚為什么這不起作用......

的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>());
}

視圖

@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”。

在控制器中,為什么即使在調用AsEnumerable()之后也會addresses動態代理的集合? 我需要做些什么來獲取我的域模型對象的集合,以便我可以將它們轉換為視圖模型?

我打賭你誤解了演員的概念。 強制轉換意味着AddressVM實例是一個Address實例...我認為它不是。 您可能必須從Address對象“轉換”或實例化AddressVM對象。 試試這個 :

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 );
}

[編輯]根據Brian的回答 ,如果實際類型和目標類型之間存在隱式轉換,則可以轉換對象。

如果您希望能夠為其轉換Address ,則需要在AddressVM上設置顯式運算符 如果要將數據從域模型輕松移動到視圖模型,可以查看AutoMapper。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM