2011-11-03 70 views
0

我有一个OData的WCF服务,它看起来像InitializeService不被称为...InitializeService不再被调用,不能工作了,为什么

代码如下:

[ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
public class MyDataService : DataService<MyContext> 
{ 
    // This method is called only once to initialize service-wide policies. 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc. 
     // Examples: 
     config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); 
     config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
     config.UseVerboseErrors = true; 
    } 

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

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

运行时,我收到以下异常报告:

服务器在处理请求时遇到错误。异常 消息是'On数据上下文类型'MyContext',顶部有 IQueryable属性'MyEntities',其元素类型不是实体 类型。确保IQueryable属性是实体类型,或者 指定数据上下文类型的IgnoreProperties属性为 忽略此属性。'。查看服务器日志以获取更多详细信息

在这种情况下,MyEntities是EntityFramework Code First DBSet。

如果我将[IgnoreProperties("MyEntities")]放在上下文上,则会在第二个属性集上抛出错误。

键我想:如果我在InitializeService方法中放置一个断点,那么它看起来不像它被调用。

真的不知道现在正在发生什么......

+0

错误说这个问题是你的数据上下文,特别是IQueryable 设置'MyEntities','MyEntities'的类型T是什么?它是一个EntityObject还是一个Linq-2-SQL对象? POCO?这些信息会有所帮助。它可能是为T提供的元数据的问题,并且该服务无法使用它。我在别处读过它可能需要一个主键或[DataServiceKey]属性。 –

+0

这是EF Code First实体。我实际上已经从一个工作项目中转移了代码......这里的问题肯定是InitializeService方法没有被调用 - 我只是无法弄清楚为什么!目前的怀疑是web.config,项目设置,一些Azure服务参考包括,...我敢肯定,当我到达那里时它会是明显的...我已经在问题中澄清了实体类型(谢谢!) – Stuart

+1

确保实体具有已定义的主键,这可能是问题所在。 –

回答

0

肖恩帮助确定上述评论的正确答案。

基本上发生了什么事情,当我导入项目时,然后stylecop将我的键名从EntityID调整为EntityId。

在SQL EF层中,这没问题 - 因为我为键设置了映射。但是,在oData服务中,它寻找以“ID”结尾的名称(区分大小写),当它没有找到它们时,它就会被解释而没有解释 - 不便于调试!