工作生产代码中的“实体没有键定义”错误

时间:2013-07-22 08:33:52

标签: entity-framework silverlight iis wcf-ria-services ria

我们遇到了一个非常奇怪的问题:我们正在使用实体框架4和ria服务来实现IIS 6.1中托管的Silverlight 5应用程序。在很长一段时间内,一切都运行顺利,但偶尔应用程序失败,并在事件日志中显示以下错误消息:

  

WebHost未能处理请求。
发件人信息:   System.ServiceModel.Activation.HostedHttpRequestAsyncResult / 56703158
  异常:System.ServiceModel.ServiceActivationException:服务   '/Services/EcoFleet-DomainServices-Repository-EcofleetRepository.svc'   由于编译过程中的异常而无法激活   异常消息是:DomainService中的实体'DeviceData'   'EcofleetRepository'没有定义键。实体类型已公开   通过DomainService操作必须至少有一个公共属性   标有KeyAttribute .. ---> System.InvalidOperationException:   DomainService'EcofleetRepository'中的Entity'DeviceData'没有   有一个键定义。 DomainService操作公开的实体类型   必须至少有一个公共财产标有   KeyAttribute。
在   System.ServiceModel.DomainServices.Server.DomainServiceDescription.ValidateEntityTypes()
  在   System.ServiceModel.DomainServices.Server.DomainServiceDescription.Initialize()
  在   System.ServiceModel.DomainServices.Server.DomainServiceDescription.CreateDescription(类型   domainServiceType)
在   System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd(TKey key, Func 2 valueFactory)
在   System.ServiceModel.DomainServices.Server.DomainServiceDescription.GetDescription(类型   domainServiceType)
在   System.ServiceModel.DomainServices.Hosting.DomainServiceHost..ctor(类型   domainServiceType,Uri [] baseAddresses)
在   System.ServiceModel.DomainServices.Hosting.DomainServiceHostFactory.CreateServiceHost(类型   serviceType,Uri [] baseAddresses)
在   System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(字符串   constructorString,Uri [] baseAddresses)
在   System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(字符串   normalizedVirtualPath,EventTraceActivity eventTraceActivity)
在   System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(ServiceActivationInfo   serviceActivationInfo,EventTraceActivity eventTraceActivity)

  在   System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(字符串   normalizedVirtualPath,EventTraceActivity eventTraceActivity)

  ---内部异常堆栈跟踪结束---在System.Runtime.AsyncResult.End [TAsyncResult](IAsyncResult结果)
  在   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult的   结果)工艺名称:w3wp
工艺ID:2300

应用程序仍然响应,但无法从服务器加载任何实体。停止并启动网站后,一切都会再次运作。

这种情况下的实体(DeviceData)是一个数据库表, 有一个密钥,无论它看起来是随机的,哪个实体都失败了。此外,我只希望在编译时看到“key not defined”错误。有没有人知道问题是什么,以及如何解决它?

2 个答案:

答案 0 :(得分:1)

您的DeviceData实体没有定义密钥,这是必需的。您应该创建名为IdDeviceDataId的属性,该属性将按约定视为关键(实体框架当前查找这些属性)。您还可以使用映射将其他属性设置为键。这可以通过数据注释属性来实现:

[Key]
public int Foo { get; set; }

或者使用流畅的映射:

modelBuilder.Entity<DeviceData>().HasKey(d => d.Foo);

答案 1 :(得分:0)

首先,你不会在编译时遇到错误,因为它不是强制性的东西,但没有一个可能会让你头痛,因为EF在很多方面使用它。因此,您必须通过命名IdDeviceDataId(使用约定)或从模型中定义一个来重新定义您的密钥。

从您的问题看来,为DeviceData定义了一个键,在这种情况下,我建议您重新查看模型中键列的属性。

请记住,没有关键列可能会降低应用的效果。