EF oData - 元素类型不是实体类型

时间:2012-06-19 14:57:18

标签: asp.net-mvc entity-framework odata

我正在尝试启动并运行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;
    }
}

3 个答案:

答案 0 :(得分:3)

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

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

HTH, 标记

答案 1 :(得分:3)

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

答案 2 :(得分:2)

我和@Trevor有同样的问题,并且最初以同样的方式解决了它。然后我发现this thread并发现我的服务项目是指Microsoft.Data.Services.Client,而我的实体项目是指System.Data.Services.Client。通过更改我的实体项目中的引用,我得到了它。