【发布时间】: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