Tôi có một thực thể khá phức tạp sẽ không lưu khi bảng cơ sở dữ liệu cụ thể thiếu một bản ghi. Khi bản ghi tồn tại, thực thể lưu chính xác. Khi hồ sơ không tôi nhận được ngoại lệ:Chỉ số không hợp lệ N cho SqlParameterCollection này với Count = N chỉ khi bảng được liên kết có bản ghi rỗng
chỉ số không hợp lệ N cho SqlParameterCollection này với Count = N
Sau khi đọc một loạt các giải pháp tìm thấy qua Google và các câu hỏi liên quan chặt chẽ nhất trên Stack Overflow :
- What's causing “Invalid index nn for this SqlParameterCollection with Count=nn” when a column is Null in the database?
- Invalid Index n for this SqlParameterCollection with Count=n” OR “foreign key cannot be null
Tôi tin rằng sự cố của tôi phải liên quan đến cách tôi thiết lập tệp ánh xạ của mình. Thực thể khách hàng có tham chiếu đến thực thể Person. Người bản đồ đến một bảng mà chúng tôi đã đọc, nhưng không viết quyền truy cập vào. Đó là khi một bản ghi cho thực thể Person không tồn tại mà tôi tạo ra ngoại lệ. Nếu hồ sơ tồn tại không có vấn đề. Tôi đã đặt tham chiếu đến Người từ khách hàng thành Nullable()
. Tôi cũng đã kiểm tra lại để đảm bảo rằng tôi không có thuộc tính được ánh xạ hai lần từ một trong hai thực thể.
Dưới đây là những gì tôi cảm thấy là thông tin bản đồ thích hợp, nhưng có thể cung cấp thêm khi cần thiết:
khách hàng
//more mapping code...
References(x => x.Person, "snl_id").Nullable();
//more mapping code...
Person
//more mapping code...
ReadOnly();
Id(x => x.SnlId).Column("SNL_ID");
//more mapping code...
Để làm phức tạp thêm vấn đề chúng tôi có một số mã đau đớn để làm cho NHibernate hoạt động tốt hơn khi Người không tồn tại. Tôi không chắc nó áp dụng ở đây, nhưng nghĩ rằng nó thích hợp, đủ để bao gồm trong câu hỏi của tôi. Chúng tôi đang sử dụng các mã dưới đây bởi vì không có nó NHibernate JIRA sẽ tạo ra tấn truy vấn. Giải pháp này được nêu trong Stack Overflow answer này.
tài sản người của Khách hàng
public virtual Person Person
{
get
{
try
{
var snlId = per.Name;
return per;
}
catch
{
return null;
}
}
set
{
per = value;
}
}
private EPerson per;
tôi đang thiếu gì trong ánh xạ của tôi có thể gây ra ngoại lệ này? Có vấn đề gì khác mà tôi không thấy?