无法从入口获得类型。实体

时间:2013-11-29 18:55:00

标签: c# entity-framework

我正在尝试为模糊断开的实体图构建一个通用方法。因此,我正在尝试验证实体是否存在,以进行适当的状态修改

 private static void ApplyChanges<TEntity>(TEntity root)
        where TEntity : class, IObjectWithState
    {
        using (var context = new MainContext())
        {
            context.Set<TEntity>().Add(root);

            CheckForEntitiesWithoutStateInterface(context);

            var entries = context.ChangeTracker.Entries<IObjectWithState>();

            foreach (var entry in entries)
            {
                //Here i try to get the type in my entries that are being tracked
                var type = ObjectContext.GetObjectType(entry.Entity.GetType());

                //context.Set<type> not regonizing the type correct.
                var entity = context.Set<type>();

提前致谢

2 个答案:

答案 0 :(得分:1)

您无法使用Type类型的变量调用泛型方法。相反,您需要通过反射调用该方法。例如:

var setMethod = context.GetType().GetMethod("Set").GetGenericMethodDefinition();
var setMethodForType = setMethod.MakeGenericMethod(type);
var entity = setMethodForType.Invoke(context, new object[0]);

不幸的是,此时实体将是object类型,因此对它的进一步操作也需要反射。解决这个问题的一种方法是创建自己的通用方法,然后反思性地调用它,这样你就可以回到“类型安全”的世界:

var doStuffMethod = [current type].GetMethod("DoStuff", BindingFlags.NonPublic | BindingFlags.Static)
    .GetGenericMethodDefinition()
    .MakeGenericMethod(type);
doStuffMethod.Invoke(null, new object[] { context });

private static void DoStuff<TEntity>(MainContext context) {
    // here you can do
    context.Set<TEntity>();
}

答案 1 :(得分:1)

非通用方法DbContext.Set怎么样?