我有一个用于报告的只读数据库的上下文,我正在编写大量代码,如下所示:
using (var context = new ReportingContext())
{
var reportXQuery = context.ReportX.AsNoTracking();
// Do stuff here with query...
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法来设置AsNoTracking一下,让刚new荷兰国际集团了ReportingContext上面会自动使用AsNoTracking,而不是需要记住显式调用它的每一个查询的?
我的目标是复制现有实体,稍微修改它,然后插入修改后的版本.
我尝试了两种似乎都有效的方法:
var thing = context.Things.Where(x => x.SomeID == someid).AsNoTracking().Single();
thing.AnotherID = 1234;
context.Things.AddObject(thing);
context.SaveChanges();
var thing = context.Things.Where(x => x.SomeID == someid).Single();
context.Detach(thing);
thing.AnotherID = 1234;
context.Things.AddObject(thing);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
据我所知,他们都在实现我的目标.其中一个比另一个好,还是它们都同样好(或错误!?)
我正在将查询从 Linq-to-Sql 迁移到 EF。为了使禁用跟踪更难以忘记,我在 Linq-To-Sql 中编写了一个 ConfigureForQuery 包装函数,该函数只需将 ObjectTrackingEnabled 设置为 false。
我想继续使用类似的策略,但根据我迄今为止收集的信息,“无跟踪”的全局设置不可用。我想听听您对如何最好地解决我现有的疑问的意见。一些代码:
public class A {
public int P1 { get; set; }
public int P2 { get; set; }
}
public class B {
public int P3 { get; set; }
public int P4 { get; set; }
}
public class MyDbContext : DbContext {
public IDbSet<A> As { get; set; }
public IDbSet<B> Bs { get; set; }
}
// scenario 1: returning IQueryable of T where IDbSet<T> …Run Code Online (Sandbox Code Playgroud)