如何强制FrameLog在ObjectChange中使用FullName作为TypeName

本文关键字:FullName 作为 TypeName 何强制 FrameLog ObjectChange | 更新日期: 2023-09-27 18:11:23

我使用FrameLog来保存EntityFramework所做的所有更改。我必须基于ObjectChange类的TypeName属性创建Type对象,但是FrameLog只存储对象类型的缩写名称和方法Type. gettype()生成异常,因为它期望FullName。

所以,如何强制FrameLog保存FullName作为TypeName在ObjectChange类?

如何强制FrameLog在ObjectChange中使用FullName作为TypeName

这是相当嵌套在FrameLog中,它不是你可以很容易地在用户区更改的东西。

    public void Record(object entity, Func<string> deferredReference, string propertyName, Func<object> deferredValue)
    {
        ensureChangeSetExists();
        var typeName = ObjectContext.GetObjectType(entity.GetType()).Name;
        var deferredObjectChange = getOrCreateNewDeferredObjectChangeFor(set, entity, typeName, deferredReference);
        record(deferredObjectChange, propertyName, deferredValue);
    }

我已经在FrameLog项目网站上为你记录了这个问题。(https://bitbucket.org/MartinEden/framelog/issues/94/iobjectchangetypename-should-include-the)

您可以编写一个函数,尝试将类型名称转换回System.Type。虽然,因为你只有类名,它永远不会是100%可靠的(即在不同的命名空间中重复的类名,等等)。

这是我的意思的一个粗略的想法,它不是很漂亮或经过测试,但应该为您指明正确的方向,直到问题在FrameLog本身得到解决。

    FrameLogTypeToSystemType(myDbContext, myObjectChange);
    public Type FrameLogTypeToSystemType<TPrincipal>(DbContext db, IObjectChange<TPrincipal> objectChange)
    {
        var objectContext = ((IObjectContextAdapter)db).ObjectContext;
        var container = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace);
        foreach (var set in container.BaseEntitySets)
        {
            //if (set.ElementType.FullName.Contains(objectChange.TypeName)) might work better???
            if (set.ElementType.FullName.EndsWith(objectChange.TypeName, StringComparison.OrdinalIgnoreCase))
                return Type.GetType(set.ElementType.FullName);
        }
    }