1

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

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

在 System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)

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

应用程序仍然响应,但不能从服务器加载任何实体。停止并启动站点后,一切都恢复正常。

这种情况下的实体(DeviceData)是一个数据库表,它确实有一个键,不管哪个实体失败似乎是随机的。此外,我只希望在编译时看到“未定义键”错误。有谁知道问题是什么,以及如何解决?

4

2 回答 2

1

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

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

或者使用流畅的映射:

modelBuilder.Entity<DeviceData>().HasKey(d => d.Foo);
于 2013-07-22T08:39:14.667 回答
0

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

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

还要记住,没有键列可能会降低应用程序的性能。

于 2013-07-22T08:47:18.240 回答