2012-07-19 27 views
10

tôi đã có kết quả từ bộ sưu tập tại Mông Cổ, cấu trúc cũng giống như thế nàytử 'Id' không phù hợp với bất kỳ lĩnh vực hay tài sản của lớp

[DataContract] 
public class Father 
{ 
    [BsonId] 
    [DataMember] 
    public MongoDB.Bson.ObjectId _id { get; set; } 

    [DataMember] 
    public string Id { get; set; } 

    [DataMember] 
    public List<Child> childs { get; set; } 
} 

[DataContract] 
public class Child 
{ 
    [DataMember] 
    public string Id { get; set; } 

    [DataMember] 
    public int Name { get; set; } 
} 

Khi tôi cố gắng này:

List<Father> f = result.ToList(); 

Gọi số Element 'Id' does not match any field or property of class Model.Child

Tôi nghĩ rằng chỉ cần 'Id' là một thứ khác.

Làm cách nào để xử lý? Cảm ơn bạn

+1

Bạn có thể cho một danh sách đầy đủ hơn của mã đó gây ra ngoại lệ này? Ví dụ, kết quả là gì? Ngoài ra, bạn có thể cho chúng tôi thấy tài liệu trông như thế nào trong cơ sở dữ liệu hay không (tốt nhất là ở định dạng json). –

+2

Tôi giải quyết vấn đề này bằng cách thêm một _id trong lớp con như tôi đã làm trong lớp chính. Tôi đoán, tất cả các ducument cần một 'id'.And nếu tôi không xác định một, hệ thống sẽ nghĩ rằng có một' _id 'trong lớp. Điều đó khiến tôi không thể chuyển tài liệu sang 'Danh sách '. – EasonBlack

+1

Xem các tùy chọn tuần tự hóa http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial - bạn có thể đánh dấu bất kỳ thuộc tính nào là id, nó không phải là '_id' chẳng hạn – Alex

Trả lời

-1

lớp con bạn có lẽ nên xác định nó được thừa hưởng Cha

public class Child: Cha {...}

lớp Cha của bạn có lẽ nên thêm thuộc tính type tiếng (cho WCF).

[DataContract] 
[KnownType(typeof(Child))] 
public class Father 

Nếu đây là MongoCollection ("cha") mà bạn lưu/tìm nạp, thì bạn có thể cần phải đăng ký bản đồ lớp cho từng loại trẻ được mong đợi.

if (!BsonClassMap.IsClassMapRegistered(typeof(Child))) 
{ 
    BsonClassMap.RegisterClassMap<Child>(
     cm => { cm.AutoMap(); }); 
} 

Vì @alexjamesbrown đã đề cập, bạn không cần đặt tên trường id trên đối tượng poco '_id'. Ý tưởng thừa kế là kế thừa. Vì vậy, sử dụng trường "id" của cha (bất kể nó được đặt tên) là đủ. Không rõ tại sao lớp cha của bạn có cả thuộc tính Id và _id. Một trong số đó có lẽ là không cần thiết.

+0

Bạn không cần sử dụng thừa kế. Tôi cũng đã gặp vấn đề này. Tôi không biết nó là gì, nhưng tôi không nghĩ rằng nó thừa kế sẽ giải quyết nó. Tôi tương tự, mã làm việc, ở nơi khác. – Daryn

+0

Điều này khiến tôi gần gũi hơn: http://stackoverflow.com/questions/13859295/strange-behavior-of-mongodb-linq-provider-for-fields-called-id. Cuối cùng, tôi đã đổi tên trường của mình thành một thứ có chứa nhiều hơn chỉ là id hoặc _id, cả trong hình chiếu pocp và mongo. Điều đó đã làm các thủ thuật – Daryn

0

tất cả những gì bạn phải làm là xóa [DataMember] trên thuộc tính ObjecId và liên kết Id với ObjectId _id.

nên lớp học của bạn sẽ trông như thế này:

[DataContract] 
public class Father 
{ 
    [BsonId] 
    public MongoDB.Bson.ObjectId _id { get; set; } 

    [DataMember] 
    public string Id { 
      get { return _id.ToString(); } 
      set { _id = ObjectId.Parse(value); } 
    } 

    [DataMember] 
    public List<Child> childs { get; set; } 
} 

ps: trong trường hợp của bạn id đứa trẻ phải được tạo ra bằng tay, nếu bạn muốn nó trở thành một ObjectId (Mông Cổ), bạn sẽ đã làm như vậy lừa cuối cùng, để deserialized đối tượng, bạn nên sử dụng tài liệu tham khảo newtonsoft.json và làm như thế này

Father = JsonConvert.DeserializeObject<Father>(response.Content); 
+0

Điều này thực sự không hoạt động - ObjectId.Parse (giá trị) luôn trả về 0 cho trường _id. Tốt hơn là chỉ lưu trữ trang này dưới dạng chuỗi IMHO – AutomationNation

0

tôi phải đối mặt với cùng er problem.Same ROR xảy ra tại var data = query.ToList();

 var collection = db.GetCollection<Product>("Products"); 

     var query = 
      from e in collection.AsQueryable<Product>() 
      where e.name == "kalem" 
      select e; 

     var data = query.ToList(); 

và chèn của tôi là thế này:

var collection = db.GetCollection<Product>("Products"); 

    collection.InsertBatch(products); 

Tôi giải quyết như sau.

 ObjectId id = new ObjectId(); 
     var collection = db.GetCollection<Product>("Products"); 

     collection.InsertBatch(products); 
     id = pr.Id; 

và tôi đã thêm id đến lớp Product như sau Lớp Product

class Product 
{ 
    public ObjectId Id { get; set; } 
    public string name { get; set; } 
    public string category { get; set; } 
    public double price { get; set; } 
    public DateTime enterTime { get; set; } 
} 
Các vấn đề liên quan