我试图让这些代码重复一点,我觉得如果对象已经为null,应该有一种初始化using语句的方法
public static CMSContent GetContent(string title, ContextDb db = null)
{
if (db == null)
{
using (db = new ContextDb())
{
return db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived);
}
}
else
{
return db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived);
}
}
原因是因为调用语句可能希望在返回的对象上运行更多的db请求,或者可能有多个调用,并且提前建立连接以缓解多个连接。
如果返回语句不能重复,那么更好的是,如果db为null,则使用then。
答案 0 :(得分:0)
查看using的文档,可以通过在Dispose()
子句中调用finally
来实现相同的行为。
修改:关于Nkosi的评论 - 我们必须记住db
最初是否为空。不确定结果代码是否真的是一个改进,至少return语句不再重复......
public static CMSContent GetContent(string title, ContextDb db = null) {
var dbWasNull = (db == null);
try {
if (dbWasNull) {
db = new ContextDb();
}
return db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived);
}
finally {
if (dbWasNull) {
db.Dispose();
}
}
}
答案 1 :(得分:0)
我按照编辑的方式接受了乔治的回答,并将其修剪了一下:
public static CMSContent GetContent(string title, ContextDb db = null)
{
var _db = db ?? new ContextDb();
try
{
return _db.CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived);
}
finally
{
if (db == null) _db.Dispose();
}
}
我做了很多狩猎,以获得更好的答案,我找不到一个。除非可能不这样做,并且有一个由单例管理的连接池。但这在这里并不实用,希望这有助于帮助其他人。
我确实遇到了不处理上下文并让GC这样做的想法,但如果我这样做,我认为我不能在晚上睡觉。
public static CMSContent GetContent(string title, ContextDb db = null)
{
return (db ?? new ContextDb()).CMSContents.FirstOrDefault(c => c.Title == title && !c.Archived);
}
是的 - 不要那样做。显然EF5就可以了,关于它自动关闭连接,但EF6不是,如果它是一次性的,你应该处理它。