不允许在查询中显式构造实体类型[MyClass]

时间:2010-06-01 19:55:51

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

就像标题所说,我有以下例外:

  

描述:事件代码:3005事件   消息:未处理的异常   发生了。例外信息:       异常类型:NotSupportedException       异常消息:实体类型的显式构造   'Company.Project.Core.Domain.Friend'   在查询中是不允许的。

我正在使用LINQ to SQL并在我的datacontext中使用以下代码:

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**

我应该如何重新编写代码以避免此错误?

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:1)

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