Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 保存/读取后出现错误的文档ID_Mongodb_Asp.net Core_Mongodb .net Driver - Fatal编程技术网

Mongodb 保存/读取后出现错误的文档ID

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;

在ASP.NET核心应用程序(使用MongoDb)中,我试图检索我刚才创建的文档

这是我的文件(POCO):

我的ASP.NET核心控制器:

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中调试我的应用程序时:

  • personX:Id={5a3b81ceff702421e00c5c7e},Name=“约翰创建于131583228941663577”
  • personY:Id={5a3b81ceff702421e00c5c7f},Name=“约翰创建于131583228941663577”
  • 虽然名称值相同,但ID略有不同为什么?我错过了什么

    我搞砸的可能是async/await,因为如果我同步地做每件事,一切都会很好

    谢谢你们的帮助,伙计们


    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});
    返回人;
    }
    
    天哪,天哪。我能给你什么?你需要一辆新车还是什么这件事让我快发疯了。。。以林换树。非常感谢!天哪,天哪。我能给你什么?你需要一辆新车还是什么这件事让我快发疯了。。。以林换树。非常感谢!