所以我开始将Entity Framework 4添加到遗留Web应用程序(ASP.NET WebForms)中。
首先,我从数据库中自动生成了一些实体。我还想申请Repository Pattern。
有一个名为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字段。
然后将该List绑定到转发器,当尝试执行<%# Eval('EmailAddress') #%>
时,它会抛出以下异常。
The entity or complex type 'Model.Visitor' cannot be constructed in a LINQ to Entities query.
A)为什么会这样?我该如何解决这个问题?我是否需要选择匿名类型然后使用它来部分初始化我的实体?我不想制作SELECT *,因为这里有一些我不需要的重字TEXT
B)为什么我见过的每个例子都使用'select new'(匿名对象)而不是初始化已知类型?除非您检索数据并在同一层中显示数据,否则匿名类型是无用的。据我所知,无法从方法返回匿名类型?那么他们的真正意义是什么?
谢谢大家
答案 0 :(得分:1)
a)它正在发生,因为访客是一个实体。您可以说以下内容,理解您将无法通过存储库中数据上下文之外的结果对象更新数据库:
var visitors =
from v in _context.Visitors
where v.IsActive
select v;
b)我不知道你在看什么样的例子,但你说的是将一组匿名类型从数据层中的存储库传递到GUI并不是你想要的。您可以使用自我跟踪实体或数据传输对象(DTO)。这个MSDN article详细解释了您的选择。