如何获取仅在运行时知道的类的DBcontext.ChangeTracker.Entries(of ???))

时间:2015-04-21 03:16:50

标签: entity-framework

我正在使用实体框架 我试图创建一个通用函数,该函数适用于只在运行时才知道类的对象。 我有一个使用类似于此的表达式的指令:

context.ChangeTracker.Entries(of Myobj1)

当然,如果我知道班级名称" MyObj1"上面的表达式工作正常。

但是,在运行时,我只有一个变量: Dim tp as type ,它包含类,我需要一个这样的表达式:

context.ChangeTracker.Entries(of tp)

谢谢!

5 个答案:

答案 0 :(得分:1)

假设objMyObj1的一个实例,那么你可以这样做:

DBcontext.ChangeTracker.Entries().Where(x => x.GetType() == obj.GetType())

答案 1 :(得分:0)

public class EmailOption : **IFollow**, IBaseEntity
{
    public int Id { get; set; }
    public string SmtpServer { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public int Port { get; set; }
    public bool EnableSsl { get; set; }
}
var entries = _context.ChangeTracker.Entries()
    .Where(x => x.Entity is **IFollow** 
    && (x.State == EntityState.Added 
    || x.State == EntityState.Modified 
    || x.State == EntityState.Deleted)).ToList();

答案 2 :(得分:0)

您可以使用此代码仅提交对特定类的更改:

        public static void ResetDBContext(this DBcontext context, Type type )
        {
            var entries = context.ChangeTracker
                                 .Entries()
                                 .Where(e => e.State != EntityState.Unchanged && e.Entity.GetType()==type)
                                 .ToArray();

            foreach (var entry in entries)
            {
                switch (entry.State)
                {
                    case EntityState.Modified:
                        entry.State = EntityState.Unchanged;
                        break;
                    case EntityState.Added:
                        entry.State = EntityState.Detached;
                        break;
                    case EntityState.Deleted:
                        entry.Reload();
                        break;
                }
            }
        }

然后将您的类型传递给此函数(使用 obj.GetType()

答案 3 :(得分:-1)

您可以使用System.Linq让您的生活更轻松

如果您有对象的实例:

DBcontext.ChangeTracker.Entries().Where(x => x == myObject)

如果您只在运行时知道类型

DBcontext.ChangeTracker.Entries().Where(x => x.GetType() == typeof(MyObj1))

否则,如果你想检查它是否是'一个班级:

DBcontext.ChangeTracker.Entries().Where(x => x is MyObj1)

如果您正在处理单个对象,则可以根据您的偏好和逻辑使用First / FirstOrDefault / Single / SingleOrDefault

答案 4 :(得分:-1)

DBcontext.ChangeTracker.Entries().Where(x => x.Entity.GetType() == typeof(MyObj1))