什么是与Entity Framework中的动态代理相关联的guid-like id?

时间:2016-06-17 16:17:18

标签: entity-framework

我正在试图弄清楚异常,并想知道如何生成Entity对象的id:

System.Data.Entity.DynamicProxies.TaskInstance_EFB25059687D16F3AB6ABF93C582495406916AC2CC28E7E312CB6B50EC3CF7A5.get_TaskLogs()

TaskInstance是这里的实体。每次发生异常时它都具有相同的标识符。只是想知道它是如何工作的。

1 个答案:

答案 0 :(得分:0)

在EF关于代理类型生成的代码库中,有一种方法......

// <summary>
// Creates an SHA256 hash of a description of all the metadata relevant to the creation of a proxy type
// for this entity type.
// </summary>
private string BuildEntityTypeHash()
{
    using (var sha256HashAlgorithm = MetadataHelper.CreateSHA256HashAlgorithm())
    {
        var hash = sha256HashAlgorithm.ComputeHash(Encoding.ASCII.GetBytes(BuildEntityTypeDescription()));

        // convert num bytes to num hex digits
        var builder = new StringBuilder(hash.Length * 2);
        foreach (var bite in hash)
        {
            builder.Append(bite.ToString("X2", CultureInfo.InvariantCulture));
        }

        return builder.ToString();
    }
}

...其中BuildEntityTypeDescription()是一种从类型的导航属性,关键成员等构建字符串的方法。

因此,基本上,代理类型名称是类型元数据的散列表示,因此只要类型不变,它就始终是相同的字符串。