如果当前对象为空,则设置使用

时间:2017-10-02 14:50:05

标签: .net entity-framework using

我试图让这些代码重复一点,我觉得如果对象已经为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。

2 个答案:

答案 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不是,如果它是一次性的,你应该处理它。

相关问题