C#Mongo驱动程序ReplaceOneModel在upsert上插入null _id

时间:2018-03-03 22:48:25

标签: c# mongodb mongodb-.net-driver upsert

我尝试使用c#mongo驱动程序在.net core 2中批量转发集合。我遇到的问题是_id字段总是插入为空。

以下是代码:

  public async Task UpsertEvents(IEnumerable<Event> events)
    {
        if(events.Count()>0){
            List<ReplaceOneModel<Event>> requests = new List<ReplaceOneModel<Event>>();
            foreach (var ev in events)
                {
                var filter = new FilterDefinitionBuilder<Event>().Where(m => m.Id == ev.Id);
                var request = new ReplaceOneModel<Event>(filter,ev);
                request.IsUpsert = true;
                requests.Add(request);
                }
            await _context.Events.BulkWriteAsync(requests);
        }
    }

对象:

 public class Event
    {
        [BsonIgnoreIfDefault]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }
    }

还有更多字段,但它们在这里并不真正相关。

为什么为id插入null的任何想法?普通插入正确生成ID。

2 个答案:

答案 0 :(得分:1)

使用UpdateOneModel并列出更新中的所有属性。

List<UpdateOneModel<Event>> requests = new List<UpdateOneModel<Event>>();
var update = Builders<Event>.Update.Set("field", "value");
var request = new UpdateOneModel<Event>(filter,update);

阅读解释here为什么upsert with replacement会在id中插入null值。但是,[BsonIgnoreIfDefault]应该适合你。

答案 1 :(得分:0)

我遇到了同样的问题,我用这个修复了它:

ConventionRegistry.Register("IgnoreIfDefault",
            new ConventionPack { new IgnoreIfDefaultConvention(true) },
            t => true);

只需添加存储库的构造函数,一切都会正常工作。使用 UpdateOneModel 将迫使您设置所有字段...在我的项目中,我有数十个字段,设置所有字段并不容易。现在我可以单独使用 ReplaceOneModel 和 BulkWrite。

var client = new MongoClient(settings.Value.ConnectionString);

var database = client.GetDatabase(settings.Value.DatabaseName);

// Add this to the constructor of your Repository and everything will work fine 

ConventionRegistry.Register("IgnoreIfDefault",
            new ConventionPack { new IgnoreIfDefaultConvention(true) },
            t => true);

快乐编码:-)