我们遇到了一个非常奇怪的问题:我们正在使用实体框架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.ConcurrentDictionary2.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”错误。有没有人知道问题是什么,以及如何解决它?
答案 0 :(得分:1)
您的DeviceData
实体没有定义密钥,这是必需的。您应该创建名为Id
或DeviceDataId
的属性,该属性将按约定视为关键(实体框架当前查找这些属性)。您还可以使用映射将其他属性设置为键。这可以通过数据注释属性来实现:
[Key]
public int Foo { get; set; }
或者使用流畅的映射:
modelBuilder.Entity<DeviceData>().HasKey(d => d.Foo);
答案 1 :(得分:0)
首先,你不会在编译时遇到错误,因为它不是强制性的东西,但没有一个可能会让你头痛,因为EF在很多方面使用它。因此,您必须通过命名Id
或DeviceDataId
(使用约定)或从模型中定义一个来重新定义您的密钥。
从您的问题看来,为DeviceData定义了一个键,在这种情况下,我建议您重新查看模型中键列的属性。
请记住,没有关键列可能会降低应用的效果。