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

时间:2015-09-04 12:52:19

标签: c# entity-framework logging

我正在使用FrameLog来保存EntityFramework所做的所有更改。我必须根据ObjectChange类的TypeName属性创建Type对象,但FrameLog只存储对象类型和方法的缩写名称Type.GetType()会生成异常,因为它需要FullName。

那么,如何在ObjectChange类中强制FrameLog将FullName保存为TypeName?

1 个答案:

答案 0 :(得分:0)

这完全嵌套在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);
        }
    }