将数据写入 MongoDB
Overview
Entity Framework Core 允许您在不显式运行数据库命令的情况下处理应用程序中的数据。 您可以在应用程序中插入、更新或删除数据,并使用 SaveChanges()
或SaveChangesAsync()
方法将这些更改保留到MongoDB 。
当您调用SaveChanges()
或SaveChangesAsync()
方法时,EF Core 提供程序会自动检测对数据所做的任何更改,并使用MongoDB查询API运行必要的命令以更新数据库。
在本指南中,您可以查看如何在配置为使用 EF Core 提供程序的应用程序上执行常见写入操作的示例。
提示
要学习;了解如何配置应用程序以使用 EF Core 提供程序,请参阅配置 EF Core 提供程序。
事务性写操作
默认, SaveChanges()
和SaveChangesAsync()
方法是事务性的。 这意味着,如果在操作过程中发生错误,提供商将回滚对数据库所做的任何更改。 因此,您的应用程序必须连接到MongoDB 服务器的支持事务的部署,例如副本集。
您可以在应用程序设置期间将DbContext
子类上的AutoTransactionBehavior
属性设置为AutoTransaction.Never
,从而在SaveChanges()
和SaveChangesAsync()
方法中禁用自动事务。 但是,我们不建议禁用此功能。 这样做会导致保存操作期间的任何并发更改或操作失败,从而使数据库处于不一致状态。
以下示例展示了如何在SaveChanges()
和SaveChangesAsync()
方法中禁用自动事务:
dbContext.Database.AutoTransactionBehavior = AutoTransactionBehavior.Never;
警告
禁用自动事务可能会导致数据不一致。 我们建议您不要禁用此功能。
Insert
您可以使用Add()
方法将单个实体插入集合中,也可以使用AddRange()
方法一次插入多个实体。
插入一个实体
Add()
方法接受与您在正在修改的DbSet
实例上指定类型相同的单个实体。
以下代码使用Add()
方法将新的Planet
对象添加到名为DbSet
的Planets
中。然后,它调用SaveChanges()
方法将该实体插入到 MongoDB collection中。
db.Planets.Add(new Planet() { name = "Pluto", hasRings = false, orderFromSun = 9 }); db.SaveChanges();
插入多个实体
AddRange()
方法接受要添加到DbSet
的实体数组。
以下代码使用AddRange()
方法将Planet
对象数组添加到名为DbSet
的Planets
中。然后,它调用SaveChanges()
方法将这些实体插入 MongoDB collection。
var planets = new[] { new Planet() { _id = ObjectId.GenerateNewId(), name = "Pluto", hasRings = false, orderFromSun = 9 }, new Planet() { _id = ObjectId.GenerateNewId(), name = "Scadrial", hasRings = false, orderFromSun = 10 } }; db.Planets.AddRange(planets); db.SaveChanges();
Update
要更新实体,请先检索要更新的实体。 然后对该实体进行更改。 提供商跟踪对实体所做的任何更改,例如设置属性或在具有列表值的字段中添加和删除项目。 要将更新保存到MongoDB,请调用SaveChanges()
方法。 EF Core 提供程序将更新后的实体与更改前实体的快照进行比较,并使用MongoDB查询API自动更新集合。
以下代码检索一个name
值为"Mercury"
的实体,然后更新name
字段。 然后,代码调用SaveChanges()
方法将该更改保留到collection中。
var planet = db.Planets.FirstOrDefault(p => p.name == "Mercury"); planet.name = "Mercury the first planet"; db.SaveChanges();
删除
您可以使用Remove()
方法从集合中删除单个实体,也可以使用RemoveRange()
方法一次删除多个实体。
删除一个实体
Remove()
方法接受与您在正在修改的DbSet
实例上指定类型相同的单个实体。
以下代码删除一个name
值为"Pluto"
的Planet
实体。 然后,它调用SaveChanges()
方法从 MongoDB collection 中删除该实体。
var planet = db.Planets.FirstOrDefault(p => p.name == "Pluto"); db.Planets.Remove(planet); db.SaveChanges();
删除多个实体
RemoveRange()
方法接受要从DbSet
中删除的实体数组。
以下代码查找两个Planet
实体并将它们添加到数组中。 然后,它使用RemoveRange()
方法从DbSet
中删除这两个实体。 最后,它使用SaveChanges()
方法从 MongoDB collection 中删除这些实体。
var pluto = db.Planets.FirstOrDefault(p => p.name == "Pluto"); var scadrial = db.Planets.FirstOrDefault(p => p.name == "Scadrial"); var planets = new[] { pluto, scadrial }; db.Planets.RemoveRange(planets); db.SaveChanges();
更多信息
要进一步了解本指南中讨论的方法,请参阅以下 .NET API 文档链接: