2011-02-03 23 views
27

Tôi đã sử dụng thành công NHibernate trong một thời gian và đã có thể giải quyết được nhiều cạm bẫy với một ứng dụng mà tôi được phát triển cùng với nó và đang chạy trong sản xuất. Các rào cản gần đây thực sự có tôi gãi đầu của tôi, mặc dù."Chỉ mục không hợp lệ n cho SqlParameterCollection này với Count = n" HOẶC "khóa ngoại không thể rỗng"

Gần đây tôi đã phải mở rộng thư viện lớp học với một số lớp học mới mà được lồng vào nhau như trẻ em đối với một số lớp đã tồn tại. Tôi vừa sao chép cùng một mô hình cho ánh xạ tổng hợp mà tôi đã thành công bằng cách sử dụng, nhưng lần này nó không hoạt động.

Bây giờ khi tôi sử dụng sau đây trong tập tin bản đồ mẹ:

<bag name="SeaInfoItems" table="EDIImport_SeaInfo" lazy="false" cascade="save-update"> 
    <key column="EDI_FK_OWNERID"/> 
    <one-to-many class="FargoGate.AppLib.EdiImportSeaInfo, FargoGate.AppLib"/> 
    </bag> 

tôi có thể chọn, trong lớp trẻ, hoặc là sử dụng:

<property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" /> 

... mà mang lại cho tôi "Chỉ số không hợp lệ n" khét tiếng cho số lỗi SqlParameterCollection với Count = n "này.

HOẶC tôi cố gắng với giải pháp này tôi tìm thấy sau khi một số Googling:

<property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" insert="false" update="false" /> 

... mà mang lại cho tôi một "Không thể chèn các giá trị NULL vào cột 'EDI_FK_OWNERID' ... cột không cho phép null . " lỗi.

Vì vậy, về cơ bản tôi phải lựa chọn giữa sâu bệnh và dịch tả.

Những gì tôi không nhận được là nó hoạt động hoàn hảo cho các lớp tổng hợp hiện có đã tồn tại và tôi thực sự không thể phát hiện sự khác biệt. Điều duy nhất là khóa ngoại này (EDI_FK_OWNERID) có thể tham chiếu đến hai bảng phụ huynh khác nhau . Thiết kế cơ sở dữ liệu xấu, tôi biết, nhưng tôi không thiết kế nó, và đó là nhiệm vụ của tôi để phát triển nó cho tốt hơn hoặc tồi tệ hơn. Tôi không thể thay đổi thiết kế cơ sở dữ liệu.

Sự khác biệt khác là tôi đã xóa hoàn toàn tham chiếu khóa ngoài khỏi các lớp con hiện có (ánh xạ cũng như các thành viên lớp). Tôi đã cố gắng thi đua tất nhiên, nhưng vô ích.

Ngoài ra tôi phát hiện ra rằng một trong các lớp mới (khá nhỏ) cũng hoạt động tốt. Nhưng tôi không thể thấy sự khác biệt ở đây là gì. Tôi đang bối rối!

Bất kỳ ai cũng có một đầu mối?

+1

thực sự là chỉ mục không hợp lệ n ... ngoại lệ có thể dẫn bạn đến thẳng http: // stackoverflow.com/questions/2298026/indexoutofrangeexception-deep-in-the-ruột-of-nhibernate/2311256 # 2311256 – Jaguar

Trả lời

58

Aaargh! Tôi đã đặt quá nhiều vào một chân sai với "không hợp lệ Index n này cho SqlParameterCollection này với Count = n" lỗi mà tôi bỏ qua rõ ràng: Một bản đồ trùng lặp của một lĩnh vực cho ONE của các lớp học. Trong đó lập bản đồ đặc biệt tôi rời lỗi này, nơi mà các khóa chính cũng được định nghĩa là một tài sản:

<id name="ID" column="ID"> 
    <generator class="guid" /> 
</id> 
<property name="ID" column="ID" /> 

Bây giờ đó là một sự lãng phí thời gian cố gắng để gỡ lỗi mà!

+0

+1 để chỉ ra rằng nó có thể là một bản sao trong ONE của các lớp học ... Tôi đã giải quyết điều này cho lớp cha mẹ ... quên hoàn toàn về một lớp trẻ em! – PJUK

+0

Đồng ý, điều này đã giúp biết những gì cần tìm kiếm. Cám ơn vì đã chia sẻ. – Nexxas

+0

Rất nhiều sau, nhưng cảm ơn. Tôi đang làm việc với cơ sở dữ liệu cũ, và bây giờ tôi đang làm việc với một bảng có 45 cột, và tôi không biết có gì sai ... và bingo, hai thuộc tính được ánh xạ tới cùng một cột vì một lỗi đánh máy copypasta . Cảm ơn! – CMPerez

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