2012-10-06 17 views
9

Chính xác là các cột được tính toán mặc định và tính toán của ServiceStack OrmLite như thế nào?ServiceStack OrmLite - Xử lý các cột mặc định và tính toán

Cụ thể: Tôi nhận được lỗi

The column "PointsAvailable" cannot be modified because it is either a computed column or is the result of a UNION operator. 

cột này được cấu hình như một cột tính toán trong một cơ sở dữ liệu SQL Server 2008.

OrmLite dường như làm điều gì đó với các cột được tính toán vì bạn có thể thêm thuộc tính '[ServiceStack.DataAnnotations.Compute]' vào thuộc tính trong một mô hình.

Bước vào mã, hàm 'ToInsertRowStatement' trong 'OrmLiteDialetBase.cs' được gọi. Trong khi chức năng đó đang kiểm tra nếu thuộc tính AutoIncrement được thiết lập, nó không kiểm tra nếu thuộc tính IsComputed được thiết lập.

Tôi không biết đây có phải là lỗi hay không, nếu tôi chỉ sử dụng sai.

+0

Tôi sẽ thử thêm một kiểm tra cho IsComputed. Nếu điều đó khắc phục được sự cố, hãy tạo yêu cầu kéo trên github với bugfix. ServiceStack là một chương trình được cấu trúc tốt, vì vậy không chắc có nhiều nơi mà việc kiểm tra này có thể xảy ra. – theMayer

+0

Để làm rõ nhận xét trước của tôi, bạn sẽ làm điều này trong mã nguồn, sau đó biên dịch lại tệp nhị phân. Không nên dùng quá 5 phút. – theMayer

Trả lời

0

Tôi giải thích rằng bạn tạo chế độ xem với các cột có liên quan (không bao gồm cột được tính) từ bảng và hoạt động từ chế độ xem thay thế. Bằng cách này bạn tránh tham chiếu đến các cột được tính toán không mong muốn. Các khung nhìn đơn giản có thể được xử lý giống như các bảng bình thường liên quan đến chèn, xóa, cập nhật và hầu hết các khía cạnh khác.

+0

Đó là kinda ... hacky. Tôi đã hy vọng có một số cách sẵn có trong ServiceStack để làm điều đó. – John

+0

@ john có vẻ như bạn hiện đang gặp phải một số lỗi trong ServiceStack OrmLite. Vì tôi không thể sửa chữa công cụ của bạn, giải pháp thay thế phải là điều tốt nhất thứ hai, đây là sự giải phẫu của tôi đối với một giải pháp thay thế. Nếu không, bạn có thể liên hệ với những người đã tạo OrmLite và yêu cầu sửa chữa. –

6

Đối với cột tính của tôi mà chỉ được tính trong lớp dịch vụ, SQL không biết gì về họ, vì vậy tôi sử dụng một sự kết hợp của các thuộc tính sau vào mô hình servicestack:

[Compute, ServiceStack.DataAnnotations.Ignore] 
public List<MyModel> MyList {get;set;} 

Sự khác biệt có vẻ là "Bỏ qua" thuộc tính mà nhấn mạnh khi có không gian tên của nó đính kèm ??. Với những thay đổi này, các truy vấn cơ bản của tôi chạy, nếu không SQL sẽ phàn nàn rằng các cột không tồn tại - đúng là đủ! Bạn có thể, theo đề nghị của t-clausen.dk sử dụng một bộ lọc SQL bằng cách cụ thể truyền một chuỗi SQL CommandText với tất cả các tên cột mà bạn muốn, nhưng tôi nghĩ rằng sẽ mở ra một vấn đề bảo trì.

Đối với một sửa lỗi nhìn vào cơ sở dữ liệu, có vẻ như SQL được tạo trên cơ sở từng nhà cung cấp bằng phương thức "toSqlString()" hoặc phương pháp tương tự. Vì vậy, có thể có một vài điểm cần chú ý đến ...

EDIT: Nó chỉ đơn giản là thuộc tính Bỏ qua thực hiện công việc. Từ nguồn:

/// IgnoreAttribute 
/// Use to indicate that a property is not a field in the table 
/// properties with this attribute are ignored when building sql sentences 

Ngoài ra còn có tùy chọn sử dụng ALIAS mà tôi chưa khám phá.

Các vấn đề liên quan