Mongodb 保存/读取后出现错误的文档ID
在ASP.NET核心应用程序(使用MongoDb)中,我试图检索我刚才创建的文档 这是我的文件(POCO): 我的ASP.NET核心控制器:Mongodb 保存/读取后出现错误的文档ID,mongodb,asp.net-core,mongodb-.net-driver,Mongodb,Asp.net Core,Mongodb .net Driver,在ASP.NET核心应用程序(使用MongoDb)中,我试图检索我刚才创建的文档 这是我的文件(POCO): 我的ASP.NET核心控制器: public class HomeController : Controller { private readonly IMongoDbContext _context; public HomeController(IMongoDbContext context) { _context = context;
public class HomeController : Controller
{
private readonly IMongoDbContext _context;
public HomeController(IMongoDbContext context)
{
_context = context;
}
public async Task<IActionResult> Index()
{
var repository = new Repository(_context);
var personX = await repository.CreatePersonAsync(name: "John created at " + DateTime.Now.ToFileTimeUtc());
var personY = await repository.GetPersonByIdAsync(personX.Id);
return View();
}
}
公共类HomeController:控制器
{
私有只读IMongoDbContext\u上下文;
公共HomeController(IMongoDbContext上下文)
{
_上下文=上下文;
}
公共异步任务索引()
{
var repository=新存储库(_上下文);
var personX=await repository.CreatePersonAsync(名称:“John created at”+DateTime.Now.ToFileTimeUtc());
var personY=await repository.GetPersonByIdAsync(personX.Id);
返回视图();
}
}
最后,在我的存储库类中:
public async Task<Person> CreatePersonAsync(string name)
{
var person = new Person() { Name = name };
var filter = Builders<Person>.Filter.Eq("_id", person.Id);
var saveResult = await this.PersonCollection.ReplaceOneAsync(filter, person, new UpdateOptions { IsUpsert = true });
return person;
}
public async Task<Person> GetPersonByIdAsync(ObjectId id)
{
var person = await this.PersonCollection.Find(x => x.Id.Equals(id)).FirstOrDefaultAsync();
return person;
}
public异步任务CreatePersonAsync(字符串名称)
{
var person=new person(){Name=Name};
var filter=Builders.filter.Eq(“\u id”,person.id);
var saveResult=wait this.PersonCollection.ReplaceOneAsync(过滤器、人员、新更新选项{IsUpsert=true});
返回人;
}
公共异步任务GetPersonByIdAsync(ObjectId)
{
var person=wait this.PersonCollection.Find(x=>x.Id.Equals(Id)).FirstOrDefaultAsync();
返回人;
}
在Visual Studio 2017 CE中调试我的应用程序时:
ASP.NET Core 2,MongoDb.Driver 2.5问题出在您的
Person
类中Id
属性没有setter,它只是在构造函数中使用值ObjectId.GenerateNewId()
初始化的。这就是为什么在调用GetPersonByIdAsync()
时,MongoDB驱动程序无法使用存储在数据库中的值填充Id
属性,而该属性将由ObjectId.GenerateNewId()生成的新Id填充
要解决此问题,请将公共setter添加到Id
属性。我还建议不要在构造函数中填充它。创建新的Person
实例以添加到数据库时,只需填写即可:
public class Person
{
[BsonId]
public ObjectId Id { get; set; }
public string Name { get; set; }
}
public async Task<Person> CreatePersonAsync(string name)
{
var person = new Person()
{
Id = ObjectId.GenerateNewId(),
Name = name,
};
var filter = Builders<Person>.Filter.Eq("_id", person.Id);
var saveResult = await this.PersonCollection.ReplaceOneAsync(filter, person, new UpdateOptions { IsUpsert = true });
return person;
}
公共类人物
{
[BsonId]
公共对象Id{get;set;}
公共字符串名称{get;set;}
}
公共异步任务CreatePersonAsync(字符串名称)
{
var person=新人员()
{
Id=ObjectId.GenerateNewId(),
Name=Name,
};
var filter=Builders.filter.Eq(“\u id”,person.id);
var saveResult=wait this.PersonCollection.ReplaceOneAsync(过滤器、人员、新更新选项{IsUpsert=true});
返回人;
}
问题出在你的个人
班级Id
属性没有setter,它只是在构造函数中使用值ObjectId.GenerateNewId()
初始化的。这就是为什么在调用GetPersonByIdAsync()
时,MongoDB驱动程序无法使用存储在数据库中的值填充Id
属性,而该属性将由ObjectId.GenerateNewId()生成的新Id填充
要解决此问题,请将公共setter添加到Id
属性。我还建议不要在构造函数中填充它。创建新的Person
实例以添加到数据库时,只需填写即可:
public class Person
{
[BsonId]
public ObjectId Id { get; set; }
public string Name { get; set; }
}
public async Task<Person> CreatePersonAsync(string name)
{
var person = new Person()
{
Id = ObjectId.GenerateNewId(),
Name = name,
};
var filter = Builders<Person>.Filter.Eq("_id", person.Id);
var saveResult = await this.PersonCollection.ReplaceOneAsync(filter, person, new UpdateOptions { IsUpsert = true });
return person;
}
公共类人物
{
[BsonId]
公共对象Id{get;set;}
公共字符串名称{get;set;}
}
公共异步任务CreatePersonAsync(字符串名称)
{
var person=新人员()
{
Id=ObjectId.GenerateNewId(),
Name=Name,
};
var filter=Builders.filter.Eq(“\u id”,person.id);
var saveResult=wait this.PersonCollection.ReplaceOneAsync(过滤器、人员、新更新选项{IsUpsert=true});
返回人;
}
天哪,天哪。我能给你什么?你需要一辆新车还是什么这件事让我快发疯了。。。以林换树。非常感谢!天哪,天哪。我能给你什么?你需要一辆新车还是什么这件事让我快发疯了。。。以林换树。非常感谢!