2013-07-22 6 views
1

우리는 매우 이상한 문제로 직면하고 있습니다. 우리는 IIS 6.1에서 호스팅되는 Silverlight 5 응용 프로그램을 위해 엔티티 프레임 워크 4 및 ria 서비스를 사용하고 있습니다. 오랜 시간 동안 모든 것이 원활하게 실행되지만 때로는 응용 프로그램이 이벤트 로그에 다음 오류 메시지와 함께 실패합니다.생산 코드에서 "엔터티에 키가 정의되지 않았습니다"오류가 발생했습니다.

WebHost가 요청을 처리하지 못했습니다.
발신자 정보 : System.ServiceModel.Activation.HostedHttpRequestAsyncResult/56703158
예외 : System.ServiceModel.ServiceActivationException : 서비스 '/Services/EcoFleet-DomainServices-Repository-EcofleetRepository.svc' 동안 예외로 인해 활성화 할 수 없습니다 편집.
예외 메시지는 DomainService의 엔터티 'DeviceData' 'EcofleetRepository'에 정의 된 키가 없습니다. DomainService 작업에 의해 에 노출 된 엔터티 유형에는 KeyAttribute와 함께 표시되는 적어도 하나의 공용 속성 이 있어야합니다. ---> System.InvalidOperationException : DomainService 'EcofleetRepository'의 엔터티 'DeviceData'에 키가 정의되어 있지 않습니다. DomainService 작업에 의해 노출 된 엔터티 유형 에는 KeyAttribute가 표시된 공용 속성이 하나 이상 있어야합니다. System.ServiceModel.DomainServices.Server.DomainServiceDescription.CreateDescription에서 System.ServiceModel.DomainServices.Server.DomainServiceDescription.Initialize()
에서 System.ServiceModel.DomainServices.Server.DomainServiceDescription.ValidateEntityTypes()
에서
(유형 System.Serv에서 System.ServiceModel.DomainServices.Server.DomainServiceDescription.GetDescription (유형 domainServiceType)
에서 System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd(TKey key, Func 2 ValueFactory의)
에서 domainServiceType)
System.ServiceModel.DomainServices.Hosting.DomainServiceHostFactory.CreateServiceHost에서 iceModel.DomainServices.Hosting.DomainServiceHost..ctor (유형 domainServiceType 우리당 [] baseAddresses)
(유형 ServiceType 자리 우리당 [] baseAddresses)
는 system.serviceModel에서 .Activation.ServiceHostFactory.CreateServiceHost (문자열 constructorString 우리당 [] baseAddresses)
System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService (문자열 normalizedVirtualPath, eventTraceActivity eventTraceActivity)
에서 System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService에서 (ServiceActivationInfo System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable (문자열 normalizedVirtualPath, EventTraceActivity eventTraceActivity)

--- 내부 예외 스택 추적의 끝 --- System.Runtime.AsyncResult에서
에서 serviceActivationInfo, EventTraceActivity eventTraceActivity)

. End [TAsyncResult] (IAsyncResult result)
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.종료 (IAsyncResult를 결과) 프로세스 이름 : W3WP
프로세스 ID는 : 2300

응용 프로그램은 계속 응답,하지만 실체는 서버에서로드 할 수 없습니다. 사이트를 중지하고 시작한 후에 모든 것이 다시 작동합니다.

이 경우 (DeviceData) 엔티티는 데이터베이스 테이블이며 에 키가 있으며 아무리 엔티티가 실패하더라도 무작위 인 것으로 간주됩니다. 또한 컴파일 타임에 "정의되지 않은 키"오류 만 볼 것으로 예상됩니다. 누군가가 문제가 무엇인지, 문제를 해결하는 방법에 대한 단서가 있습니까?

+0

나는 서비스가 싫다. 그러나 그것을 사용하십시오. 컴파일 시간이 매우 느리고 많은 제한이 있습니다. 코드 생성기를 사용한다면'[Key]'가 실제로 항목을 생성하고 있는지 확인하십시오. 나는't4'를 거의 사용하지 않습니다. EDMX는 이런 종류의 문제에 더 효과적입니다. –

+0

그것은 속성을 생성하지 않습니다,하지만 난 왜 그것이 무작위로 휴식을 마술처럼 사이트를 다시 시작하여 스스로를 일으킬 것이라고 이해가 안돼 ...하지만 난 시도하고 발전기를 변경하고 볼 수 있습니다 그것은 그것을 고친다. – sondergard

답변

1

DeviceData 엔티티에는 필수 키가 정의되어 있지 않습니다. 규칙에 따라 키로 처리되는 이름이 Id 또는 DeviceDataId 인 속성을 만들어야합니다 (Entity Framework는 현재 이러한 속성을 찾습니다). 또한 매핑을 사용하여 다른 속성을 키로 설정할 수 있습니다. 이것은 데이터 주석 속성을 달성 할 수 있습니다

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

또는 유창 매핑으로

:이 필수 일이 아니다 때문에 컴파일시 에러가되지 않습니다

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

엔티티에 이미 정의 된 키가 있습니다. 그것은 간단한 int입니다 해당 데이터베이스 테이블의 기본 키입니다. – sondergard

+0

@sondergard 키의 이름은 무엇입니까? BTW 얻을 수 없다 * 정의되지 않은 키 * 컴파일 타임 오류 –

+0

public virtual int Id {get; 세트; } – sondergard

0

첫째,하지만 데 EF가 여러면에서 그것을 사용하기 때문에 사람은 당신에게 상당히 두통을 줄 수도 있습니다. 따라서 Id 또는 DeviceDataId (규칙 사용)을 지정하거나 모델에서 키를 정의하여 키를 다시 정의해야합니다.

귀하의 질문에서 DeviceData에 대해 정의 된 키가있는 것 같습니다.이 경우 귀하의 모델에서 키 열의 속성을 다시 살펴 보도록 조언합니다.

키 열이 없으면 앱의 성능이 저하 될 수 있습니다.

+0

속성에별로 없습니다 ...Id라고하는 정수 기본 키 열과의 매핑입니다. StoreGeneratedPattern = Identity 및 EntityKey = true입니다. – sondergard