0

因此,我開始將Entity Framework 4添加到舊版Web應用程序(ASP.NET WebForms)中。爲什麼LINQ to Entities不會讓我初始化實體的某些屬性?

作爲一個開始,我已經從數據庫中自動生成了一些實體。另外我想申請存儲庫模式。

有一個叫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(); 
} 

請注意,遊客比那些更多的屬性,我只是不希望得到一切,因爲有一些沉重的TEXT字段。

該列表然後綁定到一箇中繼器,當試圖做<%# Eval('EmailAddress') #%>它會拋出以下異常。

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

A)爲什麼會發生這種情況?我該如何解決這個問題?我需要選擇一個匿名類型,然後用它來部分初始化我的實體嗎? B)爲什麼我看到的每個示例都使用'select new'(匿名對象),而不是使用'select new'(匿名對象),而不是使用'select new'初始化一個已知類型?除非您檢索數據並將其顯示在同一圖層中,否則匿名類型是無用的。據我所知,匿名類型不能從方法返回?那麼他們的真正意義在哪?

謝謝大家

+0

tblVisitor和Visitor之間有什麼關係? – 2010-04-29 01:30:00

+0

對不起,錯字。這個例子的目的都是訪客。 – emzero 2010-04-29 01:33:32

回答

1

一)這是怎麼回事,因爲觀衆是一個實體。你可以說與理解下面,你將無法通過資源庫中的數據環境之外所產生的對象來更新數據庫:

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

B)我不知道是什麼比如你正在尋找但是你是正確的說,將數據層中的存儲庫中的匿名類型集合傳遞給GUI並不是你想要的。您可以使用自我跟蹤實體或數據傳輸對象(DTO)。這MSDN article詳細解釋你的選擇。

+0

我想我的問題還不夠清楚。我知道我可以選擇整個實體,但我只想獲得一些字段(而不是SELECT *),因爲我不需要一些繁重的TEXT字段。我已經更新了我的問題。 – emzero 2010-04-29 02:41:05

+0

@Tom仍然正確,只能選擇幾個字段,您必須[投影到](http://blogs.teamb.com/craigstuntz/2009/12/31/38500/)非實體*類型。 – 2010-04-29 12:59:49

+0

是的,我不知道我不能投影到實體類型。所以我想我會創建POCO類來投射。 – emzero 2010-04-29 15:47:34

相關問題