C# 实体框架上下文6.1.3未刷新/销毁?

C# 实体框架上下文6.1.3未刷新/销毁?,c#,entity-framework,unit-testing,C#,Entity Framework,Unit Testing,在这个单元测试中,我将验证内容字节列的MD5是否正确计算、持久化和获取 但是,实体框架(6.1.3)上下文似乎没有被刷新/销毁,因为在原始SQL更新之后,该更新明显生效,但在使用新上下文获取行时没有显示 namespace UnitTests { [TestClass] public class TestDataPacketServiceDebug { [TestInitialize] public void Setup()

在这个单元测试中,我将验证内容字节列的MD5是否正确计算、持久化和获取

但是,实体框架(6.1.3)上下文似乎没有被刷新/销毁,因为在原始SQL更新之后,该更新明显生效,但在使用新上下文获取行时没有显示

namespace UnitTests
{
    [TestClass]
    public class TestDataPacketServiceDebug
    {
        [TestInitialize]
        public void Setup()
        {
            CommonMethods.ResetDatabase();
            try
            {
                CommonMethods.ResetDataPacketDirectory();
            }
            catch (DirectoryNotFoundException)
            {
            }
        }

        [TestCategory("DataPacketService"), TestMethod]
        public void TestGetLocalFilePathDebug()
        {
            // Persist a DataPacket
            int dataPacketId;
            using (var testDBContext = new TestDBContext())
            {
                DataPacket dataPacket = new DataPacket
                {
                    Content = File.ReadAllBytes(@"Resources\SampleResources.zip"),
                    Description = "DataPacketSample consist of some random found .DLL files on disk",
                    Name = "SampleResources",
                    Version = "1"
                };
                testDBContext.DataPackets.Add(dataPacket);
                testDBContext.SaveChanges();
                dataPacketId = dataPacket.DataPacketId;
            }

            // Verify file path extraction
            using (var testDBContext = new TestDBContext())
            {
                DataPacket dataPacket = DataPacketService.GetByNameAndVersion("SampleResources", "1",
                    testDBContext);

                string extractedFilePath = DataPacketService.GetLocalFilePath(testDBContext,
                    dataPacket, "EntityFramework.dll");

                string validDestinationPath = String.Format(@"{0}\DataPackets\{1}_v{2}\EntityFramework.dll",
                    AppDomain.CurrentDomain.BaseDirectory, dataPacket.Name, dataPacket.Version);

                Assert.AreEqual(validDestinationPath, extractedFilePath);

                if (File.Exists(extractedFilePath) == false)
                {
                    Assert.Fail("SampleResources was not extracted correctly");
                }
            }
            // When setting a breakpoint here and take a look with external SQL Browser
            // (e.g. Microsoft SQL Server Management Studio), following is in order:
            // Note! Not all columns are shown
            // -----------------------------------------------------------------------------------------------
            // DataPacketId | Name            | RowVersion | Content     | MD5                      | Version
            //            1 | SampleResources | NULL       | 0x504B03... | 2zSV8IChaiyf0UfnezDHKg== | 1


            // Manually modify MD5 field in database for MD5 verification
            using (var testDBContext = new TestDBContext())
            {
                string sqlUpdate = String.Format("UPDATE dbo.DataPackets SET MD5 = 'another_MD5' WHERE DataPacketId = {0}",
                    dataPacketId);
                testDBContext.Database.ExecuteSqlCommand(sqlUpdate);
            }
            // When setting a breakpoint here we can clearly see that the row has been changed:
            // Note! Not all columns are shown
            // ----------------------------------------------------------------------------------
            // DataPacketId | Name            | RowVersion | Content     | MD5         | Version
            //            1 | SampleResources | NULL       | 0x504B03... | another_MD5 | 1

            // Verify MD5
            using (var testDBContext = new TestDBContext())
            {   
                // Fetch dataPacket with modified MD5
                DataPacket dataPacket = DataPacketService.GetByNameAndVersion("SampleResources", "1", testDBContext);

                // Verify that the raw SQL command has been successful:
                Assert.AreEqual("another_MD5", dataPacket.MD5);
                // BANG!!!!!!!!!!!!!!
                // Result Message:  Assert.AreEqual failed. Expected:< another_MD5 >.Actual:< 2zSV8IChaiyf0UfnezDHKg== >.
            }
        }
    }
}
命名空间单元测试
{
[测试类]
公共类TestDataPacketServiceDebug
{
[测试初始化]
公共作废设置()
{
CommonMethods.ResetDatabase();
尝试
{
CommonMethods.ResetDataPacketDirectory();
}
捕获(DirectoryNotFoundException)
{
}
}
[TestCategory(“DataPacketService”),TestMethod]
public void TestGetLocalFilePathDebug()
{
//保存数据包
int-dataPacketId;
使用(var testDBContext=newtestdbcontext())
{
数据包数据包=新数据包
{
Content=File.ReadAllBytes(@“Resources\SampleResources.zip”),
Description=“DataPacketSample由磁盘上的一些随机找到的.DLL文件组成”,
Name=“SampleResources”,
Version=“1”
};
testDBContext.DataPackets.Add(dataPacket);
testDBContext.SaveChanges();
dataPacketId=dataPacket.dataPacketId;
}
//验证文件路径提取
使用(var testDBContext=newtestdbcontext())
{
DatapacketDatapacketService.GetByNameAndVersion(“SampleResources”,“1”,
testDBContext);
string extractedFilePath=DataPacketService.GetLocalFilePath(testDBContext,
数据包,“EntityFramework.dll”);
string validDestinationPath=string.Format(@“{0}\DataPackets\{1}\u v{2}\EntityFramework.dll”,
AppDomain.CurrentDomain.BaseDirectory,dataPacket.Name,dataPacket.Version);
AreEqual(validDestinationPath、extractedFilePath);
if(File.Exists(extractedFilePath)==false)
{
Assert.Fail(“SampleResources未正确提取”);
}
}
//在此处设置断点时,请使用外部SQL浏览器查看
//(例如Microsoft SQL Server Management Studio),顺序如下:
//注意!并非所有列都显示
// -----------------------------------------------------------------------------------------------
//DataPacketId |名称|行版本|内容| MD5 |版本
//1 | SampleResources | NULL | 0x504B03…| 2zSV8IChaiyf0UfnezDHKg==| 1
//手动修改数据库中的MD5字段以进行MD5验证
使用(var testDBContext=newtestdbcontext())
{
string sqlUpdate=string.Format(“UPDATE dbo.DataPackets SET MD5='other_MD5',其中DataPacketId={0}”,
数据包ID);
testDBContext.Database.ExecuteSqlCommand(sqlUpdate);
}
//在此处设置断点时,我们可以清楚地看到行已更改:
//注意!并非所有列都显示
// ----------------------------------------------------------------------------------
//DataPacketId |名称|行版本|内容| MD5 |版本
//1 | SampleResources | NULL | 0x504B03…|另一个| MD5 | 1
//验证MD5
使用(var testDBContext=newtestdbcontext())
{   
//使用修改的MD5获取数据包
datapacketdatapacket=DataPacketService.GetByNameAndVersion(“SampleResources”,“1”,testDBContext);
//验证原始SQL命令是否已成功执行:
AreEqual(“另一个_MD5”,dataPacket.MD5);
//砰!!!!!!!!!!!!!!
//结果消息:Assert.AreEqual失败。应为:。实际为:<2zSV8IChaiyf0UfnezDHKg=>。
}
}
}
}
实体:

public class DataPacket
{
    /// <summary>
    /// Identifier
    /// </summary>
    public int DataPacketId { get; set; }

    /// <summary>
    /// Concurrency Token
    /// </summary>
    public byte[] RowVersion { get; set; }

    /// <summary>
    /// Name
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Description of data packet
    /// </summary>
    public string Description { get; set; }

    /// <summary>
    /// Version of data packet
    /// </summary>
    public string Version { get; set; }

    /// <summary>
    /// MD5 of the data packet (i.e. MD5 of Content byte array)
    /// </summary>
    public string MD5 { get; private set; }

    private byte[] content;

    /// <summary>
    /// Byte content of the data packet (i.e. 
    /// </summary>
    public byte[] Content
    {
        get { return content; }
        set
        {
            content = value;
            UpdateMD5();
        }
    }

    /// <summary>
    /// TestCase navigation DataPacket <== One-To-Many ==> TestCases
    /// </summary>
    public ICollection<TestCase> TestCases { get; set; } // DataPacket <== One-To-Many ==> TestCases

    /// <summary>
    /// Update MD5 checksum depending on content
    /// </summary>
    private void UpdateMD5()
    {
        if (content != null)
        {
            this.MD5 = GetMD5ForBytes(content);
        }
    }

    /// <summary>
    /// Get MD5 checksum for content byte array
    /// </summary>
    /// <param name="content">Content byte array</param>
    /// <returns>MD5 checksum</returns>
    public static String GetMD5ForBytes(byte[] content)
    {
        if (content != null)
        {
            System.Security.Cryptography.MD5 md5Object = System.Security.Cryptography.MD5.Create();
            return System.BitConverter.ToString(md5Object.ComputeHash(content)).Replace("-", "");
        }

        return null;
    }
}
公共类数据包
{
/// 
///标识符
/// 
public int DataPacketId{get;set;}
/// 
///并发令牌
/// 
公共字节[]行版本{get;set;}
/// 
///名字
/// 
公共字符串名称{get;set;}
/// 
///数据包描述
/// 
公共字符串说明{get;set;}
/// 
///数据包的版本
/// 
公共字符串版本{get;set;}
/// 
///数据包的MD5(即内容字节数组的MD5)
/// 
公共字符串MD5{get;private set;}
私有字节[]内容;
/// 
///数据包的字节内容(即。
/// 
公共字节[]内容
{
获取{返回内容;}
设置
{
内容=价值;
UpdateMD5();
}
}
/// 
///测试用例导航数据包测试用例
/// 
公共ICollection测试用例{get;set;}//数据包测试用例
/// 
///根据内容更新MD5校验和
/// 
私有void UpdateMD5()
{
如果(内容!=null)
{
this.MD5=GetMD5ForBytes(content);
}
}
/// 
///获取内容字节数组的MD5校验和
/// 
///内容字节数组
///MD5校验和
公共静态字符串GetMD5ForBytes(字节[]内容)
{
如果(内容!=null)
{
System.Security.Cryptography.MD5 md5Object=System.Security.Cryptography.MD5.Create();
返回System.BitConverter.ToString(md5Object.Comput
public static DataPacket GetByNameAndVersion(string name, string version, TestDBContext testDBContext)
        {
            IQueryable<DataPacket> query = testDBContext.Set<DataPacket>();
            query = query.Where(t => t.Name == name).Where(t => t.Version == version);
            return query.Single();
        }
/// <summary>
/// MD5 of the data packet (i.e. MD5 of Content byte array)
/// </summary>
public string MD5 { get; private set; }

private byte[] content;

/// <summary>
/// Byte content of the data packet (i.e. 
/// </summary>
public byte[] Content
{
    get { return content; }
    set
    {
        content = value;
        UpdateMD5();
    }
}