【问题标题】:Add and remove operations doesn't work in entity framework添加和删​​除操作在实体框架中不起作用
【发布时间】:2014-01-20 21:42:57
【问题描述】:

当出现问题时,我正在对应用于实体框架的存储库模式进行一些测试。我已经(通过代码优先)实现了一个虚构的酒店管理软件(称为 HotelManager)的核心层和数据层,我想将其用于测试目的,并且与一堆与 DB 相关的表。

这是结构:

  1. 核心层保留在 HotelManager.Core 程序集中并包含:

    • 所有模型(使用“逆向工程代码优先”实用程序自动生成)
    • IRepostiory 接口(用于将存储库抽象为核心层)

  2. 数据层保留在 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() 实际上将一个新的utente 对象的实例添加到Utenti 存储库),lastCount 匹配到firstCount,就像什么都没有已经发生了,测试失败!我什至无法在我的存储库管理的 DbSet 中找到我全新添加的实体!当我从存储库中删除一个实体时,我得到了相同的结果。没发生什么事。这只有在我在每次 Add() 或 Remove() 操作之后调用 SaveChanges() 方法时才有效,但这是不可能的,因为我需要有机会回滚数据并且因为我只想在某些情况下与 DB 交互,明确定义的案例,以尽可能减少数据库访问。

这是 EF 的正确行为,我完全误解了它的行为还是我的项目有问题? 我一直认为,如果我运行UtentiDbSet.Add(new Utente() with {....}); 之类的东西,EF 引擎会将我的新 Utente 对象以“已添加”状态添加到 DbSet(因此,UtentiDbS​​et.Count() == 1),然后,如果我调用 SaveChanges () 在我的上下文中,数据将被持久化到数据库中。

为了您的方便,我上传了整个项目here

有一个名为 HotelManager.Data.Test 的测试项目。 我不明白为什么AddWontWork() 方法失败,而AddWithSaveChangesWillWork() 有效。 不要忘记在 HotelManager.Data.Test 项目的 app.config 中设置 connectionString(EF 会注意使用包含在数据中的映射来构建整个 DB 结构-层)。

提前致谢。

【问题讨论】:

  • 要查看您添加到 Utenti 的内容,您需要查询 ChangeTracker...
  • 那么,如果我将一个实体添加到一个 dbset,我必须得到它的唯一方法是查询 changetracker 对象吗?如果我直接遍历数据库集,除了已经持久化到数据库的实体,我什么也找不到?以及如何实现存储库的经典 GetAll() 方法?我需要将更改跟踪器的结果与 .AsEnumerable() 的结果合并?谢谢:)

标签: c# entity-framework repository add dbset


【解决方案1】:

您的 AddUser() 代码缺少 context.SaveChanges() 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多