我正在尝试启动并运行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;
}
}
答案 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。通过更改我的实体项目中的引用,我得到了它。