MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dziwne zachowanie dostawcy MongoDB LINQ dla pól o nazwie id

MongoDB wymaga, aby każdy dokument przechowywany w bazie danych miał pole (na poziomie głównym) o nazwie „_id”.

Sterownik C# zakłada, że ​​dowolne pole w klasie o nazwie „Id”, „id” lub „_id” ma być mapowane na specjalne pole „_id”. To jest konwencja, którą można przełamać. Sterownik C# nie wie, że klasa Result nie ma być używana jako dokument główny kolekcji, więc znajduje pole „id” i mapuje je na „_id” w bazie danych.

Jednym ze sposobów, w jaki możesz to obejść, jest zmiana nazwy pola w twojej klasie (jak odkryłeś). Następnie możesz również użyć atrybutu [BsonElement], aby zmapować nazwę pola C# (np. „idd”) na dowolną nazwę faktycznie używaną w bazie danych (np. „id”). Na przykład:

public class Result
{
    [BsonElement("id")]
    public int idd; // matches "id" in the database
    // other fields
}

Inną alternatywą jest zastąpienie konwencji, która znajduje element członkowski "Id" klasy, aby pominąć domyślne zachowanie sterownika C# dla klasy Result. Możesz to zrobić, rejestrując nowy ConventionProfile dla klasy wyników. Na przykład:

var noIdConventions= new ConventionProfile();
noIdConventions.SetIdMemberConvention(new NamedIdMemberConvention()); // no names
BsonClassMap.RegisterConventions(noIdConventions, t => t == typeof(Result));

Musisz to zrobić na bardzo wczesnym etapie programu, zanim klasa wyników zostanie zmapowana.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dlaczego łączenie się z MongoDB z Node.js jest wolne?

  2. RangeError:Nieprawidłowa długość bufora tablicy - Meteor JS

  3. Zakres paginacji MongoDB

  4. mongodb niechciane usunięcie pustego pola podczas aktualizacji

  5. Nie udało się znaleźć źródła danych:com.mongodb.spark.sql.DefaultSource