我正在使用FrameLog来保存EntityFramework所做的所有更改。我必须根据ObjectChange类的TypeName属性创建Type对象,但FrameLog只存储对象类型和方法的缩写名称Type.GetType()会生成异常,因为它需要FullName。
那么,如何在ObjectChange类中强制FrameLog将FullName保存为TypeName?
答案 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);
}
}