6

Dịch vụ Windows của tôi là một ứng dụng .NET. Dịch vụ này phụ thuộc vào truy cập dữ liệu của tôi sử dụng mã EF 4.3 trước. Tôi nhận được lỗi sau khi dịch vụ của tôi chạy và cố gắng truy cập dữ liệu.Thập phân làm Khóa chính hoạt động trong Dev (Win7/64bit) nhưng không phải trong Thời gian chạy ngôn ngữ chung (Win2008R2/64bit) được phát hiện đã phát hiện một chương trình không hợp lệ

Đã xảy ra lỗi trong FullPurgeAndReplace(): System.InvalidProgramException: Common Language Runtime phát hiện một chương trình không hợp lệ . tại System.Data.Entity.DynamicProxies.MOMInventoryItem_3ED5D5176D2C03867C62DD8E4381A882350CFD9CD931F3CD551623A6EF5C4D8E.set_Id (Decimal ) tại lambda_method (Đóng cửa, Shaper) tại 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 (Shaper máy ép) tại 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 nguồn) ... loại bỏ hơn

trên cùng một máy tôi có một ứng dụng web mà phụ thuộc trên cùng một dự án truy cập dữ liệu và chạy mà không có vấn đề. I DO đã bật các ứng dụng 32 bit cho Hồ bơi ứng dụng tương ứng.

Tôi đã nghiên cứu vấn đề và thấy rằng nó CÓ THỂ liên quan đến thực tế là thực thể trong lỗi (MOMInventoryItem) có khóa chính thập phân. Tôi không có lựa chọn nào vì tôi đang tích hợp với một hệ thống hiện có. Tuy nhiên, đó được cho là một known issue with EF 4.0 từ hơn một năm trước và tôi hy vọng nó sẽ được giải quyết ngay bây giờ.

Dưới đây là một số mã từ Entity tôi:

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

Một lần nữa, điều này hoạt động tốt thông qua một ứng dụng MVC lưu trữ trong IIS nhưng thất bại như một dịch vụ Windows, cả hai trên cùng một máy chủ Windows 2008 R2. Nó cũng hoạt động trên máy tính DEV của tôi (Win7/VS11). Vấn đề của tôi là gì và làm thế nào tôi có thể giải quyết nó vĩnh viễn hoặc làm việc xung quanh nó?

Như mọi khi, sự giúp đỡ được đánh giá rất cao và được đáp lại khi có thể.

+2

Tôi cũng muốn chạy hệ điều hành 65 bit. Tôi có thể tìm thấy con thú này ở đâu? Best Buy chỉ mang Windows 64 bit. Uhg. Tôi CẦN rằng thêm chút! –

+0

LOL, yep Tôi đã chỉnh sửa tiêu đề, cảm ơn Dan-o! – kingdango

+0

Aw man. Chỉ là một lỗi đánh máy! Nghĩ rằng bạn đã có một số loại xã hội bí mật với Illuminati kỹ thuật số và bán đứa con đầu lòng của bạn cho một chút ... hoặc một cái gì đó. :) –

Trả lời

2

Thử đặt dự án khởi động để nhắm mục tiêu 32 bit, điều đó sẽ ngăn sự cố 64 bit rõ ràng. Và giải thích lý do tại sao nó chạy tốt với MVC.

+1

Điều này đã giải quyết được vấn đề. Tôi cũng đăng một công việc xung quanh làm việc cho tôi trước câu trả lời này tốt hơn. Tôi sẽ trả $ 5 :) để có ai đó cho tôi biết dứt khoát tại sao điều này hoạt động tốt trên Win 7 64-bit và trên cùng một máy chủ Win 2008 RC2 dưới IIS nhưng KHÔNG phải là một dịch vụ windows. – kingdango

0

LƯU Ý: Sau đây là giải pháp hữu ích cho tôi TRƯỚC KHI tôi có câu trả lời hay hơn. Câu trả lời tốt hơn là biên dịch dự án Windows Service để nhắm mục tiêu x86 thay vì CPU bất kỳ. Điều này vẫn không trả lời tại sao Windows Server 2008 R2 lại khác với Win 7 nhưng đó là câu hỏi khác nhau cho một ngày khác.

-

Tôi tìm thấy một workaround cho vấn đề của tôi. Tôi đã thay đổi Key thành một int (vì đó thực sự là những gì đang được lưu trữ trong DB anyway, mặc dù về mặt kỹ thuật là một cột thập phân) và tôi cung cấp một cách rõ ràng TypeName = "Decimal" trong thuộc tính Column.

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

Trong trường hợp của tôi, tôi không bao giờ viết vào bảng này - mặc dù tôi có thể cần trong tương lai. Tôi không chắc chắn 100% điều này sẽ ảnh hưởng đến việc viết các hàng như thế nào nhưng vì cột được đánh dấu là DatabaseGenerated Tôi cho rằng nó sẽ không thành vấn đề.

tôi nghĩ rằng nó có thể là nếu tôi nhắm mục tiêu x86 thay vì Bất kỳ CPU sau đó nó có thể giải quyết nó và tôi sẽ cố gắng mà tiếp theo như đề nghị của @leppie

Tuy nhiên, tôi vẫn tò mò muốn biết tại sao điều này sẽ trình bày loại lỗi này - Common Language Runtime đã phát hiện một chương trình không hợp lệ.

+0

Nó có thể là tốt hơn để sử dụng 'long' thay vì' int', đưa ra một số quyết định 'thập phân' là một lựa chọn tốt cho một khóa công khai, p – leppie