You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB EF Core Provider加载根对象时嵌入集合项重复问题

MongoDB EF Core Provider加载嵌入式集合时出现重复项

环境与版本

  • .NET 8环境
  • MongoDB EF Core Provider:8.0.0正式版、7.0.0-preview.1预览版均存在此问题

项目文件

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net8.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
     </PropertyGroup>
  
    <ItemGroup>
        <PackageReference Include="MongoDB.EntityFrameworkCore" Version="8.0.0" />
    </ItemGroup>
</Project>

复现代码

using Microsoft.EntityFrameworkCore;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.EntityFrameworkCore.Extensions;

var connectionString = Environment.GetEnvironmentVariable("MONGODB_URL");
var client = new MongoClient(connectionString);
var db = MflixDbContext.Create(client.GetDatabase("sample"));

var movie1 = new Movie();
movie1._id = ObjectId.GenerateNewId();
movie1.title = "Movie 1";
movie1.actors.Add(new Actor() { FirstName = "John", LastName = "Smith" });
movie1.actors.Add(new Actor() { FirstName = "Mary", LastName = "Smith" });
db.Movies.Add(movie1);
Console.WriteLine("Total actors going to the database: " + movie1.actors.Count());
db.SaveChanges();

var movieFromDb = db.Movies.FirstOrDefault(x => x._id == movie1._id);
Console.WriteLine("Movie: " + movieFromDb.title);
Console.WriteLine("Total actors after loading from database: " + movieFromDb.actors.Count());

internal class MflixDbContext : DbContext
{
    public DbSet<Movie> Movies { get; init; }
    public static MflixDbContext Create(IMongoDatabase database) =>
        new(new DbContextOptionsBuilder<MflixDbContext>()
            .UseMongoDB(database.Client, database.DatabaseNamespace.DatabaseName)
            .Options);
    public MflixDbContext(DbContextOptions options)
        : base(options) {}

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Movie>().ToCollection("movies");
    }
}

internal class Actor
{
    public string FirstName { get; set;}
    public string LastName { get; set;}
}

internal class Movie
{
    public ObjectId _id { get; set; }
    public string title { get; set; }
    public List<Actor> actors { get; set; } = new List<Actor>();
}

运行输出

Total actors going to the database: 2

Movie: Movie 1

Total actors after loading from database: 4

数据库中实际存储的数据

sample> db.movies.find()
[
  {
    _id: ObjectId('66396aa29571e499f39d6fab'),
    title: 'Movie 1',
    actors: [
      { FirstName: 'John', LastName: 'Smith' },
      { FirstName: 'Mary', LastName: 'Smith' }
    ]
  }
]

问题说明

保存数据时集合包含2个Actor对象,但从数据库加载根对象后,嵌入式集合的数量变为4个,而数据库中的实际数据并无重复。此外还发现存在部分子项重复的情况。

怀疑是自身操作失误,但该问题在正式版8.0和预览版7.0.0-preview.1中均存在,希望确认是否有其他用户遇到相同问题,同时计划在MongoDB论坛发布该问题。

内容的提问来源于stack exchange,提问作者user23145140

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:33:27