【问题标题】:Explicit construction of entity type [MyClass] in query is not allowed不允许在查询中显式构造实体类型 [MyClass]
【发布时间】:2010-06-01 19:55:50
【问题描述】:

正如标题所说,我有以下例外:

描述:事件代码:3005 事件 消息:未处理的异常有 发生了。异常信息: 异常类型:NotSupportedException 异常消息:实体类型的显式构造 '公司.项目.核心.域.朋友' 不允许在查询中。

我正在使用 LINQ to SQL 并在我的数据上下文中有以下代码:

var friends2 = (
    from f in dc.Friends
    where f.MyFriendsAccountId == accountId
    where f.AccountId != accountId
    select new 
    {
        f.FriendId,
        AccountId = f.MyFriendsAccountId,
        MyFriendsAccountId = f.AccountId, 
        f.CreateDate,
        f.Timestamp
    }).Distinct();

result.AddRange(
    from o in friends2
    select new Friend()
    {
        FriendId = o.FriendId, 
        AccountId = o.AccountId, 
        CreateDate = o.CreateDate, 
        MyFriendsAccountId = o.MyFriendsAccountId, 
        Timestamp = o.Timestamp
    });

最后的代码块抛出错误,我很确定是这个语句 那是罪魁祸首:

.Select( o => **new Friend**

我应该如何修改我的代码以避免这个错误?

【问题讨论】:

标签: c# asp.net linq-to-sql


【解决方案1】:

不能使用 LINQ 查询创建属于数据上下文的实体。这是 C# 团队经过深思熟虑的设计决定。因为实体是在Select 语句中(手动)更新的,这意味着它们不会被DataContext 跟踪,这会使开发人员感到困惑。另一方面,当 DataContext 会自动在提交时插入那些新的实体,这也会令人困惑。剩下的唯一选择是与开发人员沟通,这不是一个好主意,而这就是您所看到的情况。

【讨论】:

  • 感谢您解释为什么它不起作用。现在,你能说明如何使它工作吗?我需要更改什么代码?谢谢。
  • result.AddRange(from o in friends2 select这一行改为result.AddRange(from o in friends2.ToArray() select
  • 您应该谨慎执行此操作,因为它会在 LINQ 查询的选择部分创建对象之前枚举friends2。
【解决方案2】:

如果您没有在 Friends 类的任何列上设置 PrimaryKey,它将起作用。这样就不会再跟踪该类的更改,但您的代码会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多