为什么LINQ to Entities不允许我初始化实体的某些属性?

时间:2010-04-29 01:25:01

标签: c# asp.net entity-framework linq-to-entities anonymous-types

所以我开始将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'(匿名对象)而不是初始化已知类型?除非您检索数据并在同一层中显示数据,否则匿名类型是无用的。据我所知,无法从方法返回匿名类型?那么他们的真正意义是什么?

谢谢大家

1 个答案:

答案 0 :(得分:1)

a)它正在发生,因为访客是一个实体。您可以说以下内容,理解您将无法通过存储库中数据上下文之外的结果对象更新数据库:

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

b)我不知道你在看什么样的例子,但你说的是将一组匿名类型从数据层中的存储库传递到GUI并不是你想要的。您可以使用自我跟踪实体或数据传输对象(DTO)。这个MSDN article详细解释了您的选择。