Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加和删除操作';不能在实体框架中工作_C#_Entity Framework_Repository_Add_Dbset - Fatal编程技术网

C# 添加和删除操作';不能在实体框架中工作

C# 添加和删除操作';不能在实体框架中工作,c#,entity-framework,repository,add,dbset,C#,Entity Framework,Repository,Add,Dbset,当问题出现时,我正在测试应用于实体框架的存储库模式。我已经实现了(首先通过代码)一个虚拟的酒店管理软件(称为HotelManager)的核心层和数据层,我想将其用于测试目的,它与一系列表到数据库有关 结构如下: 核心层位于HotelManager.core程序集中,包含: 所有型号(使用“反向工程代码优先”实用程序自动生成) iRepository接口(用于将存储库抽象到核心层) 数据层位于HotelManager.data程序集中,包含: 所有模型映射(使用“反向工程代码优先”实用程序

当问题出现时,我正在测试应用于实体框架的存储库模式。我已经实现了(首先通过代码)一个虚拟的酒店管理软件(称为HotelManager)的核心层和数据层,我想将其用于测试目的,它与一系列表到数据库有关

结构如下:

  • 核心层位于HotelManager.core程序集中,包含:

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

  • 数据层位于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
    存储库添加了一个新的
    utentete
    对象的实例),
    lastCount
    firstCount
    匹配,就像什么都没有发生一样,测试失败了!我甚至无法在我的存储库管理的数据库集中找到新添加的实体!当我从存储库中删除一个实体时,会得到相同的结果。什么也没发生。只有在每次Add()或Remove()操作后调用SaveChanges()方法时,这才有效,但这是不可能的,因为我需要有机会回滚数据,而且我只想在某些定义良好的情况下与DB交互,以尽可能减少对DB的访问

    这是EF的正确行为吗?我完全误解了它的行为,还是我的项目有问题? 我一直认为,如果我运行类似于
    utidbset.Add(new-utinte()和{….})的东西,EF引擎以“添加”状态将我的新Utene对象添加到数据库集(因此,UtentiDbSet.Count()==1),然后,如果我调用上下文的SaveChanges(),数据将被持久保存到数据库中

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

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


    提前感谢。

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

    要查看您添加到Uteni的内容,您需要查询ChangeTracker…因此,如果我向数据库集添加实体,唯一获得它的方法就是查询ChangeTracker对象?如果我直接在dbset上迭代,除了已经持久化到db的实体之外,我什么也找不到?如何实现存储库的经典GetAll()方法?我需要将更改跟踪器的结果与.AsEnumerable()的结果合并?谢谢:)