【问题标题】:InitializeService no longer being called, can't work out whyInitializeService 不再被调用,无法找出原因
【发布时间】:2011-11-03 00:35:26
【问题描述】:

我有一个 odata wcf 服务,看起来 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;
    }
}

当它运行时,我收到如下异常报告:

服务器在处理请求时遇到错误。例外 消息是'关于数据上下文类型'MyContext',有一个顶部 元素类型不是实体的 IQueryable 属性“MyEntities” 类型。确保 IQueryable 属性是实体类型或 将数据上下文类型的 IgnoreProperties 属性指定为 忽略此属性。有关详细信息,请参阅服务器日志

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

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

我认为的关键:如果我在 InitializeService 方法中放置一个断点,那么它看起来就不会被调用。

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

【问题讨论】:

  • 错误表明问题出在您的数据上下文,特别是 IQueryable 设置“MyEntities”,“MyEntities”的类型 T 是什么?它是 EntityObject 还是 Linq-2-SQL 对象?波科?这些信息会很有帮助。它可能是为 T 提供的元数据和服务无法使用它的问题。我在别处读到它可能需要一个主键或 [DataServiceKey] 属性。
  • 这是一个 EF Code First 实体。我实际上已经从一个工作项目中转移了代码......这里的问题肯定是 InitializeService 方法没有被调用 - 我只是不知道为什么!目前的怀疑是 web.config、项目设置、一些 Azure 服务参考包括......我相信当我到达那里时会很明显......我现在已经澄清了问题中的实体类型(谢谢!)
  • 确保实体定义了主键,这可能是问题所在。
  • Sean - 请发布此答案“问题可能是您没有定义 DataServiceKey”......我会很高兴地勾选它。问题是什么......当我将文件从一个项目转移到另一个项目时,stylecop 规则坚持认为主键从“EntityID”更改为“EntityId”......现在这对 EF 来说并不重要,因为我有“ [Key]" 定义加上客户映射规则......但是,对于 oData 服务,这是终端 - 而且也很难发现!谢谢!

标签: wcf wcf-data-services


【解决方案1】:

Sean 帮助确定了上述 cmets 中的正确答案。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2015-11-29
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2023-04-08
    相关资源
    最近更新 更多