C# MongoDB, LINQ 无法通过 Id 匹配
C# MongoDB, LINQ unable to match by Id
我正在使用 MongoDB.Driver (2.12.4),同时试图远离 Bson 文档。除了 Mongo 收集方法外,我对所有查询都使用 LINQ。
我有这样的底座class:
public abstract class Entity
{
public Guid Id { get; protected set; }
}
还有一个像这样的子class:
public class User : Entity
{
public string Name { get; set; }
public string Email { get; set; }
}
public User(string name = "", string email = "")
{
Id = Guid.NewGuid();
Name = name;
Email = email;
}
我的数据库class是这样初始化的:
class Database
{
const string MongoConnection = "mongodb+srv://user:password@cluster0.mongodb.net/";
public static MongoClient Client { get; private set; }
public static IMongoDatabase Directory { get; private set; }
public static IMongoCollection<User> Users { get; private set; }
public Database()
{
BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
Client = new MongoClient(MongoConnection);
Directory = Client.GetDatabase("DB");
Users = Directory.GetCollection<User>("users");
}
}
到目前为止的工作:
Database.Users.InsertOne((new User("name", "email@domain.com")); //cloud.mongodb.com shows {_id : UUID('a12937ba-7a7c-4c5d-a8ff-4049e9878ca3')}
var document = Database.Users.AsQueryable().Where(x => x.Email == "email@domain.com").FirstOrDefault();
Database.Users.AsQueryable().ToList().Where(x => x.Id == document.Id).FirstOrDefault()
但以下 none 有效:
Database.Users.Find(x => x.Id == document.Id).FirstOrDefault(); //returns null
Database.Users.AsQueryable().Any(x => x.Id == document.Id); //returns false
Database.Users.ReplaceOne(x => x.Id == document.Id, document); //returns MatchedCount = 0
因此,似乎只要我使用 .ToList,一切就会按预期进行。但是,如果我直接在集合上使用 .AsQueryable、.Find、.Any 或 .ReplaceOne,那么它将无法执行 ID 之间的匹配。
我找不到不使用 [BsonId] 或 [BsonElement] 且不使用过滤器和构建器的类似问题。如果我理解正确,MongoDB.Driver 应该自动进行映射,并且对于每个 属性 它都有效,除了 Id。我错过了什么?
PS: 我没有使用 Entity Framework
您需要在应用启动时添加:
BsonDefaults.GuidRepresentation = GuidRepresentation.Standard;
这使得可以使用 Guid Id 进行查询。
它确实对最新的驱动程序有一个“过时”的评论,但我想这是一个错误。
我正在使用 MongoDB.Driver (2.12.4),同时试图远离 Bson 文档。除了 Mongo 收集方法外,我对所有查询都使用 LINQ。
我有这样的底座class:
public abstract class Entity
{
public Guid Id { get; protected set; }
}
还有一个像这样的子class:
public class User : Entity
{
public string Name { get; set; }
public string Email { get; set; }
}
public User(string name = "", string email = "")
{
Id = Guid.NewGuid();
Name = name;
Email = email;
}
我的数据库class是这样初始化的:
class Database
{
const string MongoConnection = "mongodb+srv://user:password@cluster0.mongodb.net/";
public static MongoClient Client { get; private set; }
public static IMongoDatabase Directory { get; private set; }
public static IMongoCollection<User> Users { get; private set; }
public Database()
{
BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
Client = new MongoClient(MongoConnection);
Directory = Client.GetDatabase("DB");
Users = Directory.GetCollection<User>("users");
}
}
到目前为止的工作:
Database.Users.InsertOne((new User("name", "email@domain.com")); //cloud.mongodb.com shows {_id : UUID('a12937ba-7a7c-4c5d-a8ff-4049e9878ca3')}
var document = Database.Users.AsQueryable().Where(x => x.Email == "email@domain.com").FirstOrDefault();
Database.Users.AsQueryable().ToList().Where(x => x.Id == document.Id).FirstOrDefault()
但以下 none 有效:
Database.Users.Find(x => x.Id == document.Id).FirstOrDefault(); //returns null
Database.Users.AsQueryable().Any(x => x.Id == document.Id); //returns false
Database.Users.ReplaceOne(x => x.Id == document.Id, document); //returns MatchedCount = 0
因此,似乎只要我使用 .ToList,一切就会按预期进行。但是,如果我直接在集合上使用 .AsQueryable、.Find、.Any 或 .ReplaceOne,那么它将无法执行 ID 之间的匹配。
我找不到不使用 [BsonId] 或 [BsonElement] 且不使用过滤器和构建器的类似问题。如果我理解正确,MongoDB.Driver 应该自动进行映射,并且对于每个 属性 它都有效,除了 Id。我错过了什么?
PS: 我没有使用 Entity Framework
您需要在应用启动时添加:
BsonDefaults.GuidRepresentation = GuidRepresentation.Standard;
这使得可以使用 Guid Id 进行查询。 它确实对最新的驱动程序有一个“过时”的评论,但我想这是一个错误。