实体框架:Db上下文范围和事务

时间:2014-10-12 03:52:30

标签: asp.net-mvc entity-framework transactions

我有一个MVC 5网络应用程序,它与我的类库讨论db需求,类库使用Entity Framework 6。
以下是班级图书馆的两种方法 他们俩都在发起一个新的背景。如何在不使用类级别变量的情况下,仅使用一个上下文? 另外,如果这两种方法是保存东西context.SaveChanges(),那么即使保存在不同的类中,如何将它们包装到一个事务中?

public int FindUnknownByName(string name, string language)
{
    using (var context = new ScriptEntities())
    {
        int languageId = this.FindLanguage(language);
        var script = context.scripts.Where(l => l.Name == name && l.Unknown == true && l.LanguageId == languageId).FirstOrDefault();
        if (script != null)
        {
            return script.Id;
        }
        return 0;
    }
}

public int FindLanguage(string language)
{
    using (var context = new ScriptEntities())
    {
        var lang = context.languages.Where(l => l.Name == language).FirstOrDefault();
        if (lang != null)
        {
            return lang.Id;
        }
        return 0;
    }
}

2 个答案:

答案 0 :(得分:0)

使上下文成为私有类变量。

private ScriptEntities context = new ScriptEntities()
public int FindUnknownByName(string name, string language)
{
        int languageId = this.FindLanguage(language);
        var script = context.scripts.Where(l => l.Name == name && l.Unknown == true && l.LanguageId == languageId).FirstOrDefault();
        if (script != null)
        {
            return script.Id;
        }
        return 0;
}

public int FindLanguage(string language)
{
        var lang = context.languages.Where(l => l.Name == language).FirstOrDefault();
        if (lang != null)
        {
            return lang.Id;
        }
        return 0;

}

还实现IDisposable并处理上下文。

答案 1 :(得分:0)

您可以使用扩展方法:

public int FindUnknownByName(this ScriptEntities context, string name, string language)
{
        int languageId = context.FindLanguage(language);
        var script = context.scripts.Where(l => l.Name == name && l.Unknown == true && l.LanguageId == languageId).FirstOrDefault();
        if (script != null)
        {
            return script.Id;
        }
        return 0;.
}

public int FindLanguage(this ScriptEntities context, string language)
{
    var lang = context.languages.Where(l => l.Name == language).FirstOrDefault();
    if (lang != null)
    {
        return lang.Id;
    }
    return 0;    
}

然后:

using (var context = new ScriptEntities())
{
  var language = context.FindUnknownByName('name', 'language')
}