当出现问题时,我正在对应用于实体框架的存储库模式进行一些测试。我已经(通过代码优先)实现了一个虚构的酒店管理软件(称为 HotelManager)的核心层和数据层,我想将其用于测试目的,并且与一堆与 DB 相关的表。
这是结构:
核心层位于 HotelManager.Core 程序集中并包含:
- 所有模型(使用“逆向工程代码优先”实用程序自动生成)
- IRepostiory 接口(用于将存储库抽象为核心层)
.
数据层位于 HotelManager.Data 程序集中并包含:
- 所有模型映射(使用“逆向工程代码优先”实用程序自动生成)
- 所有存储库实现
- 上下文(使用“逆向工程代码优先”实用程序自动生成)
- 包含所有存储库的工作单元
如您所见,数据层公开了一个工作单元类,客户端应用程序使用它来操作数据,但在这里我注意到了一个奇怪的行为。事实上,包含在我的 UoW 中的所有存储库都可以正确加载,但是添加和删除操作根本不起作用!
例如:
[TestMethod]
public void AddWontWork()
{
int firstCount = this._hotelManagerUoW.Utenti.AsEnumerable().Count();
AddUser();
int lastCount = this._hotelManagerUoW.Utenti.AsEnumerable().Count();
Assert.IsTrue(lastCount == firstCount + 1);
}
private void AddUser()
{
Utente utente = new Utente();
utente.Nome = "Alex";
utente.Cognome = "DeLarge";
utente.Indirizzo = "London st.";
utente.Nazione = "England";
utente.Password = "mypassword";
utente.Username = "MyUsername";
utente.ZipCode = "784521";
utente.Citta = "Coventry";
this._hotelManagerUoW.Utenti.Add(utente);
}
这种测试方法会失败!我不知道为什么,但即使在AddUser()
调用方法之后(AddUser()
实际上向Utenti
存储库添加了一个新utente
对象的实例),lastCount
匹配到firstCount
,就像什么都没发生一样,并且测试失败了!我什至无法在我的存储库管理的 DbSet 中找到我全新添加的实体!当我从存储库中删除一个实体时,我得到了相同的结果。什么都没发生。这只有在我在每个 Add() 或 Remove() 操作之后调用 SaveChanges() 方法时才有效,但这是不可能的,因为我需要有机会回滚数据并且因为我只想在某些情况下与 DB 交互,明确定义的案例,以尽可能少地减少数据库访问。
这是 EF 的正确行为,我完全误解了它的行为,还是我的项目有问题?我一直认为,如果我运行类似的东西UtentiDbSet.Add(new Utente() with {....});
,EF 引擎会将我的新 Utente 对象以“已添加”状态添加到 DbSet(因此,UtentiDbSet.Count() == 1),然后,如果我调用 SaveChanges()我的上下文中,数据将被持久化到数据库中。
为了您的方便,我在这里上传了整个项目。
有一个名为HotelManager.Data.Test的测试项目。我不明白为什么AddWontWork()
方法失败,而AddWithSaveChangesWillWork()
工作。不要忘记在HotelManager.Data.Test项目的 app.config 中设置 connectionString(EF 将使用包含在数据层中的映射来构建整个 DB 结构)。
提前致谢。