将数据写入 MongoDB
概述
Entity Framework Core 允许您在应用程序中操作数据,而无需显式运行数据库命令。您可以在应用程序中插入、更新或删除数据,并使用 SaveChanges()
或 SaveChangesAsync()
方法将更改持久化到 MongoDB。SaveChanges()
或 SaveChangesAsync()
方法。
当您调用 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;
警告
禁用自动事务可能会导致数据不一致。我们建议您不要禁用此功能。
插入
您可以使用 Add()
方法向您的集合中插入单个实体,或者使用 AddRange()
方法一次插入多个实体。
插入单个实体
Add()
方法接受一个与您在修改的 DbSet
实例上指定的类型相同的单个实体。
以下代码使用 Add()
方法将一个新的 Planet
对象添加到名为 Planets
的 DbSet
。然后它调用 SaveChanges()
方法将此实体插入到 MongoDB 集合中。
db.Planets.Add(new Planet() { name = "Pluto", hasRings = false, orderFromSun = 9 }); db.SaveChanges();
插入多个实体
AddRange()
方法接受一个实体数组,您想将其添加到 DbSet
。
以下代码使用 AddRange()
方法将一个包含 Planet
对象的数组添加到名为 Planets
的 DbSet
中。然后调用 SaveChanges()
方法将这些实体插入到 MongoDB 集合中。
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();
更新
要更新一个实体,首先检索要更新的实体。然后对该实体进行更改。提供者跟踪对实体的任何更改,例如设置属性或在具有列表值的字段中添加和删除项。要保存更新到 MongoDB,请调用 SaveChanges()
方法。EF Core 提供者将更新的实体与更改前的实体快照进行比较,并自动使用 MongoDB 查询 API 更新集合。
以下代码检索名称值为 "Mercury"
的实体,然后更新名称字段。然后代码调用 SaveChanges()
方法将更改持久化到集合中。
var planet = db.Planets.FirstOrDefault(p => p.name == "Mercury"); planet.name = "Mercury the first planet"; db.SaveChanges();
删除
您可以使用 Remove()
方法从集合中删除单个实体,或使用 RemoveRange()
方法一次性删除多个实体。
删除一个实体
删除方法(Remove()
)接受一个类型与在修改的DbSet
实例中指定的类型相同的单个实体。
以下代码删除一个Planet
实体,其实体的name
值为"Pluto"
。然后调用SaveChanges()
方法从MongoDB集合中删除该实体。
var planet = db.Planets.FirstOrDefault(p => p.name == "Pluto"); db.Planets.Remove(planet); db.SaveChanges();
删除多个实体
删除范围方法(RemoveRange()
)接受一个要从中删除实体的DbSet
的数组。
以下代码找到两个Planet
实体并将它们添加到数组中。然后使用RemoveRange()
方法从DbSet
中删除这两个实体。最后,使用SaveChanges()
方法从MongoDB集合中删除这些实体。
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 文档链接