MongoDB yêu cầu mọi tài liệu được lưu trữ trong cơ sở dữ liệu phải có một trường (ở cấp cơ sở) được gọi là "_id".
Trình điều khiển C # giả định rằng bất kỳ trường nào trong lớp của bạn được gọi là "Id", "id" hoặc "_id" có nghĩa là được ánh xạ tới trường "_id" đặc biệt. Đây là một quy ước, một quy ước có thể được ghi đè. Trình điều khiển C # không biết rằng lớp Kết quả của bạn không được sử dụng làm tài liệu gốc của một bộ sưu tập, vì vậy nó tìm trường "id" của bạn và ánh xạ trường đó thành "_id" trong cơ sở dữ liệu.
Một cách bạn có thể ghi đè điều này là thay đổi tên của trường trong lớp của bạn (như bạn đã phát hiện ra). Những gì bạn cũng có thể làm sau đó là sử dụng thuộc tính [BsonElement] để ánh xạ tên trường C # của bạn (ví dụ:"idd") với bất kỳ tên nào thực sự đang được sử dụng trong cơ sở dữ liệu (ví dụ:"id"). Ví dụ:
public class Result
{
[BsonElement("id")]
public int idd; // matches "id" in the database
// other fields
}
Một giải pháp thay thế khác là ghi đè quy ước tìm thành viên "Id" của một lớp để ngăn chặn hành vi mặc định của trình điều khiển C # cho lớp Kết quả của bạn. Bạn có thể làm điều này bằng cách đăng ký một ConventionProfile mới cho lớp Kết quả của bạn. Ví dụ:
var noIdConventions= new ConventionProfile();
noIdConventions.SetIdMemberConvention(new NamedIdMemberConvention()); // no names
BsonClassMap.RegisterConventions(noIdConventions, t => t == typeof(Result));
Bạn phải đảm bảo thực hiện điều này rất sớm trong chương trình của mình, trước khi lớp Kết quả của bạn được ánh xạ.