如何强制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中,它不是你可以很容易地在用户区更改的东西。
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);
}
}