在Entity Framework中是否可以制作一个自定义转换器方法,通过显式转换将整数转换为实体?
我对此做了一些研究,我不知道从哪里开始。
以下是我正在尝试做的一个例子。
int activeTeacherId = 38;
Teacher activeTeacher = (Teacher)activeTeacherId;
编辑1 经过一些快速研究后,我发现如果我需要一切真正的通用和灵活的话,我可能需要对EntityObject做一些事情。但是,我不确定如何。
编辑2 根据我自己的经验,我设法创建了以下代码。但是,由于显而易见的原因,我无法在静态上下文中获得“this”。
如果我能够以某种方式得到它被转换成的对象的类型(因为它并不总是被转换为EntityObject,但有时是人或教师),那么它理论上会起作用。
public class EntityObject : System.Data.Objects.DataClasses.EntityObject
{
public static explicit operator EntityObject(int id)
{
var container = ModelContainer.Instance;
var thisType = this.GetType(); //this can't be done from a static context, so how do we retrieve the type that we are converting into?
var containerType = typeof (ModelContainer);
dynamic setProperty = typeof (ModelContainer).GetProperty(thisType.Name + "Set");
ObjectSet<dynamic> set = setProperty.GetValue(container);
return set.FirstOrDefault(o => o.Id == id);
}
}
答案 0 :(得分:0)
我终于做到了!基于Peter的建议(参见他对我的问题的评论),我在“int”上创建了一个扩展方法,允许我执行我正在寻找的动作。
我为这个算法感到自豪,因为我自己想出了大部分算法。它涉及一些严肃的反思内容,lambda表达式的动态创建以及对它们的评估。但它有效!
任何使其更短或更好的建议都将受到赞赏。
public static class EntityObjectExtensions
{
private static int Id;
public static T ToEntity<T>(this int id) where T : class
{
lock(typeof(ModelContainer))
{
Id = id;
var container = ModelContainer.Instance;
var thisType = typeof (T);
while (thisType.BaseType != typeof (EntityObject))
{
thisType = thisType.BaseType;
}
var setProperty = typeof (ModelContainer).GetProperty(thisType.Name + "Set");
dynamic set = setProperty.GetValue(container);
var firstOrDefaultMethod =
typeof (Enumerable).GetMethods().FirstOrDefault(m => m.Name == "FirstOrDefault" && m.GetParameters().Count() == 2);
var firstOrDefaultGenericMethod = firstOrDefaultMethod.MakeGenericMethod(thisType);
var lambda = typeof (Func<,>);
var genericLambda = lambda.MakeGenericType(thisType, typeof (bool));
var lambdaParameter = (Func<T, bool>) Delegate.CreateDelegate(genericLambda, typeof(EntityObjectExtensions).GetMethod("Compare", BindingFlags.Static | BindingFlags.NonPublic));
dynamic item = firstOrDefaultGenericMethod.Invoke(null, new object[] {set, lambdaParameter});
return (T) item;
}
}
private static bool Compare(dynamic item)
{
lock (typeof(ModelContainer))
{
return item.Id == Id;
}
}
}