5

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 :

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?

Trả lời

2

Trong khi giải pháp loại bỏ thuộc tính snl_id của Scott khỏi lớp Khách hàng khắc phục sự cố, nó gây ra các vấn đề mà tôi không thể có được-- snl_id có thể tồn tại trong bảng Khách hàng ngay cả khi không có bản ghi bảng Person tương ứng. Vì đó là trường hợp có những lúc tôi sẽ cần truy cập vào snl_id khi tôi không thể truy cập nó thông qua thuộc tính Person được liên kết.

Tôi đã xem xét một số giải pháp thay thế nhưng đã giải quyết khi tạo chế độ xem bảng khách hàng bao gồm khóa chính của Bảng khách hàng và snl_id từ bảng khách hàng. Sau đó ánh xạ thuộc tính đó thông qua tham gia vào chế độ xem.

Join("v_cust_id_snl_id", j => j.KeyColumn("cust_id").Map(x => x.SnlId, "snl_id") 

Thay đổi này cho phép tôi ăn bánh và ăn. Tôi đã có thể giữ tài sản SnlId trên khách hàng, nhưng không còn ném ngoại lệ khi lưu.

1

Bạn có snl_id được tham chiếu là thuộc tính trong Khách hàng cũng như là khóa chính cho đối tượng con không? Nếu vậy, điều này gây ra lỗi bạn đang nhận. Xóa thuộc tính khỏi Khách hàng và sử dụng Người để lấy giá trị.

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