Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc EF oData-元素类型不是实体类型_Asp.net Mvc_Entity Framework_Odata - Fatal编程技术网

Asp.net mvc EF oData-元素类型不是实体类型

Asp.net mvc EF oData-元素类型不是实体类型,asp.net-mvc,entity-framework,odata,Asp.net Mvc,Entity Framework,Odata,目前我正在尝试启动并运行一个odata演示,但我看到了以下错误: '在数据上下文类型'TweetPicContext'上,有一个顶级IQueryable 元素类型不是实体类型的属性“用户”。确保 IQueryable属性是否为实体类型或指定 数据上下文类型上的IgnoreProperties属性忽略此属性 财产 令人恼火的是,我的代码几乎是一个现有项目的剪贴画——但显然有些地方出了问题 查看前面的问题/答案,常见的答案似乎是DataServiceKey属性,但我已经在使用它了 有人知道我哪里出错

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

'在数据上下文类型'TweetPicContext'上,有一个顶级IQueryable 元素类型不是实体类型的属性“用户”。确保 IQueryable属性是否为实体类型或指定 数据上下文类型上的IgnoreProperties属性忽略此属性 财产

令人恼火的是,我的代码几乎是一个现有项目的剪贴画——但显然有些地方出了问题

查看前面的问题/答案,常见的答案似乎是
DataServiceKey
属性,但我已经在使用它了

有人知道我哪里出错了吗

这是我的数据上下文:

public class TweetPicContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Picture> Pictures { get; set; }
}
公共类TweetPicContext:DbContext { 公共数据库集用户{get;set;} 公共数据库集图片{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");
    }
}
[DataServiceKey(“UserID”)]
公共类用户
{
[关键]
public int UserID{get;set;}
公共字符串名称{get;set;}
公共字符串TwitterHandle{get;set;}
公共字符串TwitterIconUrl{get;set;}
公共int TwitterId{get;set;}
公共字符串TwitterAuthorizationToken{get;set;}
公共字符串TwitterAuthorizationTokenSecret{get;set;}
public DateTime DateJoinedUtc{get;set;}
公共字符串UniqueDeviceToken{get;set;}
公共虚拟ICollection图片{get;set;}
公共用户()
{
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;
    }
}
[服务行为(IncludeExceptionDetailInFaults=true)]
公共类TweetPicOData:DataService
{
//此方法只调用一次以初始化服务范围策略。
公共静态无效初始化服务(IDataServiceConfiguration配置)
{
config.SetEntitySetAccessRule(“用户”,EntitySetRights.AllRead);
config.SetEntitySetAccessRule(“Pictures”,EntitySetRights.AllRead);
config.UseVerboseErrors=true;
}
//看http://romiller.com/2010/07/19/ef-ctp4-tips-tricks-wcf-data-service-on-dbcontext/
受保护的覆盖TweetPicContext CreateDataSource()
{
var ctx=base.CreateDataSource();
//禁用代理对象创建。
ctx.Configuration.ProxyCreationEnabled=false;
返回ctx;
}
}

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

升级到WCF Data Services 5.0或更高版本应该可以解决此问题。自版本5.0以来,我们一直通过NuGet:分发位

嗯,,
马克

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

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

这是在ASP.Net MVC 4网站中-svc文件显示
System.Data.Services.DataServiceHostFactory,System.Data.Services,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089
能否尝试将WCF Data Services的版本提高到5.0或更高版本?早期版本没有将DbContext识别为属于实体框架,因此WCF DS实际上切换到使用反射提供程序而不是EF提供程序。(说来话长,但我认为升级到5.0或5.0.1将解决您的问题。)Bazinga!结果。升级到答案,您将赢得10分。我的猜测是,我以前的服务使用的是ctp版本——不知怎么的,它起了作用。非常感谢您的帮助。您提到了“其他答案”,但这是今天出现的第一个google结果,因此,仅供参考(维护一个较旧的项目并从5.6.0升级到5.6.3库)-对我来说,它只是缺少了“DataServiceKey”。显然5.6.0不需要这个属性。@mdisibio谢谢。你的评论应该是这个问题的答案之一。升级到5.6.2后,我遇到了与DataServiceKey相同的问题。可能您也需要更新wcf服务器端库:System.Data.Services.Client来自.net framework,而Microsoft.Data.Services.Client来自Microsoft Data Services服务器NuGet。在我的例子中,框架只提供了ODatav2,NuGet让我得到了V3。一定要尊重正确的人。