Entity Framework dbset attach 非静态方法需要一个目标
Entity Framework dbset attach non-static method requires a target
我正在从 EF 手动加载 DBSET,并且基本映射有效。当同一个 DBSET 必须用于延迟加载的另一个查询时会发生错误,它 returns 错误“非静态方法需要目标”,示例:
// class 1
public Transaction GetTx(int id){
// load data to POCO with other source
Transaction tx = new Transaction() { prop1 = 1, prop2 = "xx");
ctx.Transactions.Attach(tx);
return tx;
}
// class 2
public void OtherMethod(){
Transaction tx = GetTx(1);
// do something with tx
// load with lazy loading
var detail = context.Detail.Where(x => x.Service.Code == tx.Port.Service.Code).ToList(); // here occurs error "non-static method requires a target"
}
如何手动加载DBSET,然后继续延迟加载其他相关的table?
编辑 1:
我正在使用离线加载,因为我遇到了性能问题。我正在将“数据库优先”的旧项目迁移到“代码优先”,EF 代码与往常一样,但映射已更改(我正在使用 Oracle 10g)。出于某种原因,DB First 的查询执行时间不到 50 毫秒,但 Code First 的执行时间超过 3 秒,而且是一项关键服务。
如果我离线加载主要 table,它会保持在 50 毫秒以内。我可以改变什么来获得与 Code First 相同的 DB First 性能,而不必改变逻辑?
PS: 我用的是.Net 4.5.1, EF 6.2, Oracle 10g 几个月来更新这些功能的机会不多(公司政策我没法修改)
您没有离线使用 DbSet。它需要数据库连接。在离线情况下,您可以使用 Sqlite provider or (for testing) the in-memory provider.
我正在从 EF 手动加载 DBSET,并且基本映射有效。当同一个 DBSET 必须用于延迟加载的另一个查询时会发生错误,它 returns 错误“非静态方法需要目标”,示例:
// class 1
public Transaction GetTx(int id){
// load data to POCO with other source
Transaction tx = new Transaction() { prop1 = 1, prop2 = "xx");
ctx.Transactions.Attach(tx);
return tx;
}
// class 2
public void OtherMethod(){
Transaction tx = GetTx(1);
// do something with tx
// load with lazy loading
var detail = context.Detail.Where(x => x.Service.Code == tx.Port.Service.Code).ToList(); // here occurs error "non-static method requires a target"
}
如何手动加载DBSET,然后继续延迟加载其他相关的table?
编辑 1:
我正在使用离线加载,因为我遇到了性能问题。我正在将“数据库优先”的旧项目迁移到“代码优先”,EF 代码与往常一样,但映射已更改(我正在使用 Oracle 10g)。出于某种原因,DB First 的查询执行时间不到 50 毫秒,但 Code First 的执行时间超过 3 秒,而且是一项关键服务。
如果我离线加载主要 table,它会保持在 50 毫秒以内。我可以改变什么来获得与 Code First 相同的 DB First 性能,而不必改变逻辑?
PS: 我用的是.Net 4.5.1, EF 6.2, Oracle 10g 几个月来更新这些功能的机会不多(公司政策我没法修改)
您没有离线使用 DbSet。它需要数据库连接。在离线情况下,您可以使用 Sqlite provider or (for testing) the in-memory provider.