3

我正在尝试启动并运行一个 odata 演示,但我看到了这个错误:

'在数据上下文类型'TweetPicContext'上,有一个顶级 IQueryable 属性'Users',其元素类型不是实体类型。确保 IQueryable 属性是实体类型或在数据上下文类型上指定 IgnoreProperties 属性以忽略此属性。

令人讨厌的是,我的代码几乎是现有项目的剪切和粘贴 - 但显然出了点问题......

查看以前的问题/答案,常见的答案似乎是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;
    }
}
4

3 回答 3

3

WCF 数据服务 5.0 添加了在使用 DbContext 时调用 EF 提供程序所需的支持。如果您将 DbContext 与早期版本的 WCF 数据服务一起使用,堆栈将回退到使用反射提供程序而不是 EF 提供程序。这将导致类似于您所描述的行为。

升级到 WCF 数据服务 5.0 或更高版本应该可以解决该问题。从 5.0 版开始,我们一直在通过 NuGet 分发位:http ://www.nuget.org/packages/Microsoft.Data.Services.Client 。

HTH,马克

于 2012-06-19T16:10:31.197 回答
3

我有同样的问题。我用作数据源的对象位于一个单独的库中,出于某种原因,当我在我的网站中将该类复制为 .cs 文件时,一切正常。我认为这是因为版本问题。

于 2013-02-28T07:26:36.993 回答
2

我和@Trevor 有同样的问题,一开始我用同样的方法解决了。然后我找到了这个线程,发现我的服务项目指的是 Microsoft.Data.Services.Client,而我的实体项目指的是 System.Data.Services.Client。通过更改我的实体项目中的引用,我得到了它的工作。

于 2014-01-22T11:35:29.613 回答