2010-06-01 1 views
8

Comme le dit le titre, je l'exception suivante:Construction explicite de type d'entité [MyClass] dans la requête n'est pas autorisé

Description: Code d'événement: 3005 événement message: Une exception non gérée a eu lieu. Informations sur les exceptions: Type d'exception: NotSupportedException Message d'exception: Construction explicite du type d'entité 'Company.Project.Core.Domain.Friend' dans la requête n'est pas autorisée.

J'utilise LINQ to SQL et ai le code suivant dans mon 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 
    }); 

le bloc de code final est de lancer l'erreur et je suis sûr qu'il est cette déclaration qui est le coupable :

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

Comment devrais-je retravailler mon code pour éviter cette erreur?

+0

Répondu ici: http://stackoverflow.com/questions/787296/explicit-construction-of-entity-type-in-query-is-not-allowed –

+0

Merci, mais je ne suis toujours pas complètement clair. J'apprécierais une illustration compte tenu de ma situation particulière. Merci. –

Répondre

11

Les entités qui font partie du contexte de données ne peuvent pas être créées à l'aide d'une requête LINQ. C'est une décision de conception bien pensée de l'équipe C#. Parce que les entités sont créées (manuellement) dans l'instruction Select, cela signifie qu'elles ne sont pas suivies par le DataContext et que cela peut dérouter les développeurs. D'un autre côté, lorsque le DataContext insère automatiquement sur ces nouvelles entités, cela pourrait également être source de confusion. La seule option restante était de communiquer aux développeurs que ce n'était pas une bonne idée à faire, et c'est ce que vous avez vu se produire.

+0

Merci pour l'explication de pourquoi cela ne fonctionne pas. Maintenant, pourriez-vous illustrer comment le faire fonctionner? Quel code dois-je changer? Merci. –

+1

Changez la ligne 'result.AddRange (de o dans friends2 select' à' result.AddRange (de o dans friends2.ToArray() select'.) – Steven

+1

Vous devriez être prudent en faisant cela, car il va énumérer friends2 avant de créer l'objet dans la partie sélectionnée de la requête LINQ. – Vedran

1

Cela fonctionnera si PrimaryKey n'est pas défini sur les colonnes de votre classe Friends. De cette façon, les modifications ne seront plus suivies pour cette classe, mais votre code fonctionnera.

Questions connexes