Services de données WCF, DTO et Entity Framework: l'argument de DbIsNullExpression doit faire référence à une primitive, une énumération ou un type de

J'ai un problème étrange avec $ select dans WCF Data Services combiné avec Entity Framework. Les entités Entity Framework ne sont pas directement exposées par le service. Au contraire, EF est interrogé et les résultats sont projetés sur un DTO qui est exposé.

Voici un exemple de requêtes qui fonctionnent bien, jusqu'aux requêtes correctement formées dans la base de données:

/Test.svc/Files

     

/Test.svc/Files?$filter=Name eq 'exemple'

Mais cela ne fonctionnera PAS:

/Test.svc/Files?$select=Id

Il lève cette exception dans la base de code EntityFramework:

L'argument de DbIsNullExpression doit faire référence à une primitive, une énumération ou un type de référence.

... à ce stade de la pile d'appels:

System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.ValidateIsNull (argument DbExpression, Boolean allowRowType)

Voir ci-dessous pour plus de détails sur les entités en question. La propriété IQueryable se trouve sur le conteneur de source de données (implémentant IUpdatable), qui est utilisé par le service.

  • File is the entity framework object being pulled by dbContext.Files
  • EdmFile is the DTO that I am projecting to, and exposing via the OData service.

Voici le IQueryable exposé par mon conteneur de données:

public IQueryable Files
{
    get
    {

        var files = dbContext.Files //EF collection of File
            .Select(f => new EdmFile() { Id = f.Id, Name = f.Name });

        return files; //return projection onto EdmFile
    }
}

If I return files.ToList(), the $select will work. However, the IQueryable will then be prematurely enumerated and ALL of the files (ignoring any requested $filter, etc.) will be retrieved from the database.

Voici l'entité/DTO que je suis en train d'exposer:

[DataServiceKey("Id")]
public class EdmFile
{
    public long Id { get; set; }
    public string Name { get; set; }
}

Voici l'entité Entity Framework:

public partial class File
{
    public long Id { get; set; }
    public string Name { get; set; }
}

J'ai essayé à plusieurs reprises Googling ceci et lu attentivement, mais je ne peux pas obtenir n'importe où avec les résultats. Toute aide serait appréciée à ce sujet !!

4

1 Réponses

Je ne sais pas quelle version de EntityFramework vous utilisez, mais il semble que ce problème a été corrigé dans EntityFramework 6.1.0

Here is the issue on codeplex: https://entityframework.codeplex.com/workitem/826

Here is the SO question and answer that helped me: https://stackoverflow.com/a/25320462/466100

0
ajouté