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
相关产品推荐
相关产品推荐

