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

相关问题