我正在使用实体框架 我试图创建一个通用函数,该函数适用于只在运行时才知道类的对象。 我有一个使用类似于此的表达式的指令:
context.ChangeTracker.Entries(of Myobj1)
当然,如果我知道班级名称" MyObj1"上面的表达式工作正常。
但是,在运行时,我只有一个变量: Dim tp as type ,它包含类,我需要一个这样的表达式:
context.ChangeTracker.Entries(of tp)
谢谢!
答案 0 :(得分:1)
假设obj
是MyObj1
的一个实例,那么你可以这样做:
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))