2014-03-07 53 views
1

我得到這個錯誤:The entity or complex type 'ebs.Models.ExtraItemVM' cannot be constructed in a LINQ to Entities query.在這條線:Asp.Net MVC C#附加信息:實體或複雜類型不能在LINQ構造查詢實體

booking.ExtraItemsVM = extralist.ToList(); 

我見過的這個其他例子,如果您嘗試映射到實際的數據庫表,則表示出現此錯誤。

在我的情況下,我試圖映射到ViewModel。

我的控制器代碼如下。

首先從數據庫中獲取「額外」的列表:

// get a list of extras 
var extralist = db.Extras.Where(x => x.hotel_id == AccID) 
    .Select(e => new ExtraItemVM 
    { 
     eID = e.additem_id, 
     Description = e.additem_text, 
     Price = e.additem_cost, 
     Count = 0 
    }); 

然後創建一個新的「預訂」視圖模型,並嘗試額外的列表附加到Booking.ExtraItemsVM屬性失敗:

Booking booking = new Booking(); 
booking.ExtraItemsVM = extralist.ToList();   

的ViewModels *

public class Booking 
{ 
    public int ID { get; set; } 
    public bool HasResults { get; set; } 
    public List<ExtraItemVM> ExtraItemsVM { get; set; } 
    ... 
    ... 
} 

public class ExtraItemVM 
{ 
    public int ID { get; set; } 
    public long eID { get; set; } 
    public string Description { get; set; } 
    public decimal Price { get; set; } 
    public int Count { get; set; } 
} 

數據庫模型

public class Extra 
{ 
    [Key] 
    [Display(Name = "ID")] 
    public long additem_id { get; set; } 
    public long hotel_id { get; set; } 
    public string additem_text { get; set; } 
    public decimal additem_cost { get; set; } 
} 

我不認爲我映射到數據庫表的 - 所以任何人都可以請幫助說明我做錯了嗎?

謝謝

馬克

回答

0

我沒有足夠的信息來複制這個問題,但我有一個嚴肅的感覺,這是下面的代碼段。

var extralist = db.Extras.Where(x => x.hotel_id == AccID) 
    .Select(e => new ExtraItemVM 
    { 
    eID = e.additem_id, 
    Description = e.additem_text, 
    Price = e.additem_cost, 
    Count = 0 
    }); 

調試這個最簡單的方法可能是消除Select子句或Where子句,看看是否消除了你的問題。你可以在幾步之內做到這一點,而不是一舉嘗試做到這一點。

+0

我想嘗試的第一件事是'。選擇([...]' –

+0

喜@AlexandreRondeau前添加'.AsEnumerable()' - 就是這樣 - 謝謝 - 如果你提交答案...歡呼聲,馬克 – Mark

+0

嗨@pitaylor - 謝謝你的建議。它試圖附加到預訂視圖模型時仍然出現錯誤。 – Mark

0

在這種情況下,我們需要更多的信息才能真正找到根本原因。前兩件事我會試着去調試。

1)驗證查詢(where子句)不會導致任何問題。對於這一點,你需要建立你的VM

var extralist = db.Extras.Where(x => x.hotel_id == AccID) 
        .AsEnumerable() //This will force L2E to execute the query 
        .Select(e => new ExtraItemVM 
         { 
           eID = e.additem_id, 
           Description = e.additem_text, 
           Price = e.additem_cost, 
           Count = 0 
         }); 

2)第二個選擇是刪除VM類,並使用匿名類之前強制L2E運行查詢。

var extralist = db.Extras.Where(x => x.hotel_id == AccID) 
        .Select(e => new() 
         { 
           eID = e.additem_id, 
           Description = e.additem_text, 
           Price = e.additem_cost, 
           Count = 0 
         }) 
        .AsEnumerable(); 

如果第二個選項有效,那麼您的虛擬機對於L2E是不合法的。爲了在Select語句中構建一個類,必須使用具有默認構造函數的類(就像在示例代碼中一樣)。 可以解釋了很多關於這方面的一個很好的問題是一個:The entity cannot be constructed in a LINQ to Entities query

+0

這比我的答案要好得多。我只想說明理解這種情況下延遲加載的重要性。 – PlTaylor

相關問題