C# DbContext.Set<;张力>;()在测试框架中返回垃圾数据代理

C# DbContext.Set<;张力>;()在测试框架中返回垃圾数据代理,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,在我的测试框架中,当我调用DbContext.Set()时,我被返回了一大堆垃圾数据(代理,似乎是System.data.Entity.Dynamicproxies)。如果我调用DbContext.fakeclassas,我不会得到任何垃圾 问题是,在泛型存储库bass类中,我调用的是DbContext.Set(),因为使用它显然是减少代码的好方法。但是我需要为我的测试框架解决这个问题 这是测试代码-结果应该是2,因为只有两个被添加到DbContext数据库集中 [TestMethod]

在我的测试框架中,当我调用
DbContext.Set()
时,我被返回了一大堆垃圾数据(代理,似乎是
System.data.Entity.Dynamicproxies
)。如果我调用
DbContext.fakeclassas
,我不会得到任何垃圾

问题是,在泛型存储库bass类中,我调用的是
DbContext.Set()
,因为使用它显然是减少代码的好方法。但是我需要为我的测试框架解决这个问题

这是测试代码-结果应该是2,因为只有两个被添加到DbContext数据库集中

[TestMethod]
    public void FindAll_Should_Work()
    {
        // Arrange
        var dbContext = new FakeDbContext();

        // Act
        var s1= dbContext.FakeClass1s;
        var s2 = dbContext.Set<FakeClass1>();

        // Assert
        Assert.AreEqual(2, s1.Count());
        Assert.AreEqual(2, s2.Count());
    }
此外,这些额外的结果实际上是在运行其他测试期间累积的数据。在那里,我找到了具有来自其他测试的值的对象。即使我单独运行这个测试,并注释掉使用和测试这些其他对象的代码,这种情况也会出现。所以有些东西被记住了

此外,查看该局部变量窗口,似乎
s1
实际上是一个
DbSet
,其中
s2
是一个查询(?):


编辑:标记了正确答案,但希望在此注意:问题是从System.Data.Entity.DbContext继承的。显然,要做的只是实现接口,而不是像andrerpena建议的那样从这个类派生。当我停止从System.Data.Entity.DbContext继承时,这种奇怪的行为就消失了。

您所称的垃圾是您在
PopulateData
中创建的实体,并且以某种方式被持久化到数据库中。这些
dynamicProxies
是从
FakeClass1
FakeClass2
继承的动态类型的对象。EF创建代理的原因是,您可以从延迟加载和正确的属性同步中获益

您的
FakeDbContext
继承自真实的
DbContext
。这将导致实体实际被持久化并从存储中检索(您必须调用SaveChanges,这样才能发生这种情况,但您可能正在这样做,或者在过去这样做过)。这不是一个好的做法


人们通常会创建一个
IDbContext
接口,然后专门为您的上下文创建另一个接口。类似于
IYourAppContext

的内容为清晰起见,我从中继承的是System.Data.Entity.DataContext,它在我的应用程序中没有连接字符串,因此它实际上没有连接到任何真实的数据库。这让我对持续存在的14个实体非常好奇。但肯定与从System.Entity.DataContext继承有关。我仍然不知道为什么会这样,我当然想知道答案。(我从你提出的解决方案中看到了智慧——我仍然想更进一步地了解发生了什么)。
public class FakeDbContext : System.Data.Entity.DbContext
{
    public DbSet<FakeClass1> FakeClass1s { get; set; }
    public DbSet<FakeClass2> FakeClass2s { get; set; }

    public FakeDbContext()
    {
        PopulateData();
    }

    private void PopulateData()
    {
        var f11 = new FakeClass1()
        {
            ID = 1,
            Name = "One"
        };
        var f12 = new FakeClass1()
        {
            ID = 2,
            Name = "Two"
        };            
        FakeClass1s.Add(f11);
        FakeClass1s.Add(f12);
    }
}