6

내 Windows 서비스는 .NET 응용 프로그램입니다. 이 서비스는 EF 4.3 Code First를 사용하는 데이터 액세스에 의존합니다. 내 서비스가 실행되고 데이터에 액세스하려고하면 다음 오류가 발생합니다. FullPurgeAndReplace()에서 발생프로덕션 (Win2008R2/64bit)에서는 Dev (Win7/64bit)에서 Decimal이 기본 키로 작동합니다. 공용 언어 런타임에서 잘못된 프로그램이 발견되었습니다.

오류 : System.InvalidProgramException : 공용 언어 런타임은 유효하지 않은 프로그램을 발견했습니다. System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly [TEntity (Func을 2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper) at System.Data.Common.Internal.Materialization.Coordinator
1.ReadNextElement에서 lambda_method에서 System.Data.Entity.DynamicProxies.MOMInventoryItem_3ED5D5176D2C03867C62DD8E4381A882350CFD9CD931F3CD551623A6EF5C4D8E.set_Id ( 진수) (클로저 셰이퍼()에서 셰이퍼 동일한 시스템에서 성형기) System.Data.Common.Internal.Materialization.Shaper 1.SimpleEnumerator.MoveNext() at System.Collections.Generic.List 1..ctor (IEnumerable을 1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
소스 1) ...의 더 제거

난 의존하는 웹 애플리케이션을 동일한 데이터 액세스 프로젝트에서 문제없이 실행됩니다. IIS의 해당 웹 사이트 각 응용 프로그램 풀에 대해 32 비트 응용 프로그램 사용 확인란을 선택했는지 확인합니다.

문제점을 조사한 결과 오류 (MOMInventoryItem)의 엔터티에 10 진수 기본 키가 있음을 알 수있었습니다. 기존 시스템과 통합되므로 선택의 여지가 없습니다. 그러나 그것은 1 년 전에 나온 known issue with EF 4.0 일 것으로 추정되며 지금은 해결 될 것으로 기대됩니다.

[Table("STOCK")] 
public class MOMInventoryItem 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None), Column("STOCK_ID")] 
    public virtual decimal Id { get; set; } 

는 다시,이 IIS에서 호스팅 MVC 응용 프로그램을 통해 잘 작동하지만 Windows 서비스로 실패, 모두 동일한 Windows 2008 R2 서버 : 여기

내 법인에서 일부 코드입니다. 또한 내 DEV 컴퓨터 (Win7/VS11)에서도 작동합니다. 내 문제는 무엇이며 영구적으로 해결할 수 있습니까?

언제나 도움이 되었기 때문에 가능한 한 도움을 주시면 최대한 도움을 주실 수 있습니다.

+2

65 비트 OS를 실행하고 싶습니다. 이 짐승은 어디에서 찾을 수 있습니까? Best Buy는 64 비트 Windows 만 제공합니다. 응. 나는 그 여분의 작은 조각을 필요로한다! –

+0

LOL, 네, 제목을 고쳤습니다, Dan-o에게 감사합니다! – kingdango

+0

아우 맨. 그냥 오타! 디지털 일루미네이션으로 어떤 종류의 비밀스런 사회가 있다고 생각하고 장자를 팔았습니다. :) –

답변

2

명백한 64 비트 문제를 방지해야하는 32 비트를 대상으로 시작 프로젝트를 설정하십시오. MVC로 왜 잘 돌아가는지 설명하십시오.

+1

이것이 문제를 해결했습니다. 나는 또한이 좋은 대답에 앞서 나를 위해 일한 해결 방법을 게시했다. 나는 $ 5를 지불하고 누군가가 내게 WIN 7 64 비트와 IIS 2008에서는 같은 Windows 2008 RC2 서버에서 작동하지만 Windows 서비스는 아닌 이유를 분명히 말해달라고했다. – kingdango

0

참고 : 다음은 더 나은 답변을 찾기 전에 해결 된 해결 방법입니다. 더 나은 대답은 모든 CPU 대신 x86을 대상으로 Windows 서비스 프로젝트를 컴파일하는 것이 었습니다. 여전히 Windows Server 2008 R2가 Win 7과 다른 이유는 아직 답을 찾지 못했지만 다른 날에는 다른 질문입니다.

-

나는 내 문제에 대한 해결 방법을 발견했다. 내 키를 int로 변경 했으므로 (실제로 어쨌든 기술적으로 십진수 열에도 DB에 저장되는 것이므로) Column 속성에 TypeName = "Decimal"을 명시 적으로 제공합니다.

[Table("STOCK")] 
public class MOMInventoryItem 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column("STOCK_ID", TypeName = "Decimal")] 
    public virtual int Id { get; set; } 

제 경우에는 필자는 앞으로이 테이블에 글을 남기지 않습니다. 나는 이것이 행 작성에 어떻게 영향을 미치는지 100 % 확신하지는 않지만 열이 DatabaseGenerated로 표시 되었기 때문에 문제가되지 않을 것이라고 가정하고 있습니다.

나는 그것이 내가 대신 모든 CPU의 86을 대상으로하는 경우 그럼에도 불구하고 @leppie

에 의해 제안 후 그것을 해결할 수 있습니다 내가 그 다음을 시도 할 것이다있을 가능성이 생각 나는 이유는 것 알고 아직도 궁금합니다 이 유형의 오류 표시 - 공용 언어 런타임에서 유효하지 않은 프로그램을 발견했습니다.

+0

'int' 대신'long'을 사용하는 것이 더 나을지도 모릅니다.'decimal'이 공개 키를위한 좋은 선택이라고 생각되면 어떤 것이 주어 졌다고 생각하면; – leppie

관련 문제