2012-06-19 2 views
3

Я пытаюсь получить OData демо и работает в данный момент, но я вижу эту ошибку:EF OData - тип элемента не является тип сущности

'On data context type 'TweetPicContext', there is a top IQueryable property 'Users' whose element type is not an entity type. Make sure that the IQueryable property is of entity type or specify the IgnoreProperties attribute on the data context type to ignore this property.

Раздражает то, что мой код в значительной степени является вырезкой и вставкой существующего проекта - но, очевидно, что-то не так ...

Глядя на предыдущие вопросы/ответы, общий ответ кажется атрибутом DataServiceKey, но я уже использую это.

У кого-нибудь есть идеи, в которых я ошибаюсь?

Это мой контекст данных:

public class TweetPicContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Picture> Pictures { get; set; } 
} 

Это мой пользовательский класс данных:

[DataServiceKey("UserID")] 
public class User 
{ 
    [Key] 
    public int UserID { get; set; } 

    public string Name { get; set; } 
    public string TwitterHandle { get; set; } 
    public string TwitterIconUrl { get; set; } 
    public int TwitterId { get; set; } 
    public string TwitterAuthorizationToken { get; set; } 
    public string TwitterAuthorizationTokenSecret { get; set; } 
    public DateTime DateJoinedUtc { get; set; } 
    public string UniqueDeviceToken { get; set; } 

    public virtual ICollection<Picture> Pictures { get; set; } 

    public User() 
    { 
     DateJoinedUtc = DateTime.UtcNow; 
     UniqueDeviceToken = Guid.NewGuid().ToString("N"); 
    } 
} 

Это моя служба пользователя:

[ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
public class TweetPicOData : DataService<TweetPicContext> 
{ 
    // This method is called only once to initialize service-wide policies. 
    public static void InitializeService(IDataServiceConfiguration config) 
    { 
     config.SetEntitySetAccessRule("Users", EntitySetRights.AllRead); 
     config.SetEntitySetAccessRule("Pictures", EntitySetRights.AllRead); 
     config.UseVerboseErrors = true; 
    } 

    // see http://romiller.com/2010/07/19/ef-ctp4-tips-tricks-wcf-data-service-on-dbcontext/ 
    protected override TweetPicContext CreateDataSource() 
    { 
     var ctx = base.CreateDataSource(); 

     // Disable proxy object creation. 
     ctx.Configuration.ProxyCreationEnabled = false; 
     return ctx; 
    } 
} 
+0

Это находится на веб-сайте ASP.Net MVC 4 - svc-файл говорит 'System.Data.Services.DataServiceHostFactory, System.Data.Services, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089' – Stuart

+0

Можете ли вы попробовать поднять вашу версию служб данных WCF до версии 5.0 или выше? Более ранние версии не признавали DbContext как принадлежащий Entity Framework, поэтому WCF DS фактически переключается на использование поставщика Reflection, а не на поставщика EF. (Длинная история, но я думаю, что переход до 5.0 или 5.0.1 исправит вашу проблему.) Http://nuget.org/packages/Microsoft.Data.Services.Client –

+0

Bazinga! Результат. Обновите ответ, и вы выиграете 10 очков. Я предполагаю, что моя старая служба использовала версию ctp - и это как-то сработало. Большое спасибо за вашу помощь. – Stuart

ответ

3

WCF Data Services 5.0 добавлена поддержка, необходимая для вызова поставщика EF при использовании DbContext. Если вы используете DbContext с более ранней версией служб данных WCF, стек вернется к использованию поставщика Reflection, а не к поставщику EF. Это приведет к поведению, аналогичному тому, что вы описываете.

Обновление проблемы до версии WCF Data Services 5.0 или более поздней версии должно решить проблему. Начиная с версии 5.0, мы распределяем биты через NuGet: http://www.nuget.org/packages/Microsoft.Data.Services.Client.

НТН, Марк

+0

Возможно, вам также потребуется обновить библиотеку на стороне сервера wcf: http://www.nuget.org/packages/Microsoft.Data.Услуги –

3

У меня была такая же проблема. Объект, который я использовал в качестве источника данных, был в отдельной библиотеке, и по какой-то причине, когда я дублировал класс как .cs-файл на своем веб-сайте, все работало нормально. Я предполагаю, что это из-за проблем с версией.

+1

Это скорее правильный ответ! – Adaptabi

2

У меня была та же проблема, что и @Trevor, и сначала разрешил ее. Затем я нашел this thread и обнаружил, что мой сервис-проект относится к Microsoft.Data.Services.Client, а проект с моими объектами относится к System.Data.Services.Client. Изменив ссылку в моем проекте сущности, я получил ее работу.

+0

Это решило мою проблему. –

+0

System.Data.Services.Client - это .net framework, в то время как Microsoft.Data.Services.Client находится на сервере NuGet служб данных Microsoft. В моем случае фреймворк предоставил только OData V2, а NuGet получил V3. Просто будьте уверены, чтобы почитать правильный. – Jerther

Смежные вопросы