我知道标题看起来有点糟糕:)但我不知道如何解释我的问题..
这对我来说通常是一个基本问题,但我不知道答案..
我正在编写一个服务器应用程序,它使用eneter库进行客户端 - 服务器通信,并且它还有一个DAL从数据库获取数据。因为它是服务器应用程序,它总是需要与数据库通信,所以我不知道哪种方式更有效。 (大约最多50个客户端将连接到服务器)
我正在使用实体框架并从我的mysql db创建了一个模型。
第一个代码在这里
private MyEntities ent;
public DbHelper()
{
ent = new MyEntities();
}
void Foo()
{
ent.Mytable.where......
....
}
和第二类型代码是
void Foo()
{
using (MyEntities ent = new MyEntities())
{
ent.Mytable.where...
}
}
我是否可以使用using语句或为dal类创建 global 实例变量并将其用于每个函数..?
答案 0 :(得分:2)
更好的是,在DAL类上实现IDisposable:
public sealed class MyDal implements IDisposable
{
private MyEntities ent = new MyEntities();
void Foo()
{
ent.Mytable.where......
....
}
public void Dispose()
{
ent.Dispose();
}
}
则...
using(var dal = new MyDal())
{
dal.Foo();
//....
}
阅读here,了解我的IDisposable密封的原因。
答案 1 :(得分:1)
这两种方法在变更跟踪的范围方面非常不同。如果两者同样有效,请确保使用WithNoTracking
。
您可以像在第一个代码中一样为实体创建成员变量。但是因为你不能在它周围写一个using(){}
语句,所以包含的类应该是IDisposable
。然后消费类应该在using(){}
内使用它。
答案 2 :(得分:1)
从性能角度来看,这无关紧要。与实际数据库交互相比,创建上下文实例是一种非常快速的操作。
但是,您应该在任何情况下处置创建的上下文,因为它将数据库连接保存为本机资源。
如果您希望使用DbHelper
类中的上下文成员,则此类应实现IDisposable
,以便在DbHelper
实例本身处置时可以处置上下文:
public class DbHelper : IDisposable
{
private MyEntities ent;
public DbHelper()
{
ent = new MyEntities();
}
public void Foo()
{
//...
}
public void Bar()
{
//...
}
public void Dispose() // implementation of IDisposable
{
ent.Dispose();
}
}
您可以在using
块中使用此类:
using (var helper = new DbHelper())
{
helper.Foo();
helper.Bar();
} // helper and helper.ent gets disposed now
答案 3 :(得分:1)
这取决于存在的其他方法以及它们的作用。如果要使用ORM进行更改并保留这些更改,则需要创建对象的数据上下文。此外,如果您希望身份管理器在两次查询相同的事物时为您提供相同的对象实例,则需要使用相同的数据上下文 - 因此您需要将其保持在方便状态。最后,如果类型使用延迟加载并且您希望它能够工作 - 那么如果您已经处理了数据上下文,那么这将无效。
但是,如果您只想要对数据进行只读访问而不进行更改跟踪,延迟加载或身份管理:请急切配置。也许可以考虑像微型ORM这样的东西,它们根本没有这些功能(故意,最小化和快速)。