Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类构造函数与使用数据库连接语句_C#_Asp.net Mvc_Entity Framework_Constructor - Fatal编程技术网

C# 类构造函数与使用数据库连接语句

C# 类构造函数与使用数据库连接语句,c#,asp.net-mvc,entity-framework,constructor,C#,Asp.net Mvc,Entity Framework,Constructor,我有两个场景(下面的例子),它们都是发出数据库请求的完全合法的方法,但是我不确定哪一个是最好的 示例一-这是我们在构建新应用程序时通常使用的方法 private readonly IInterfaceName _repositoryInterface; public ControllerName() { _repositoryInterface = new Repository(Context); } public JsonResult MethodName(string someP

我有两个场景(下面的例子),它们都是发出数据库请求的完全合法的方法,但是我不确定哪一个是最好的

示例一-这是我们在构建新应用程序时通常使用的方法

private readonly IInterfaceName _repositoryInterface;

public ControllerName()
{
    _repositoryInterface = new Repository(Context);
}

public JsonResult MethodName(string someParameter)
{
    var data = _repositoryInterface.ReturnData(someParameter);
    return data;
}

protected override void Dispose(bool disposing)
{
    Context.Dispose();
    base.Dispose(disposing);
}

public IEnumerable<ModelName> ReturnData(filter)
{
    Expression<Func<ModelName, bool>> query = q => q.ParameterName.ToUpper().Contains(filter)

    return Get(filter);
}
这两个示例都以某种形式使用实体框架(第一个比另一个更为如此),每个表都有模型和映射文件,可以查询这些文件。第二个示例在第一个示例中所做的主要事情(关于EF)是使用
迁移
作为存储过程代码生成的一部分。此外,两者都实现了与下面第二个链接中类似的存储库模式

我对示例一的理解是,一旦调用控制器,存储库和上下文就会被实例化。当调用存储库时,它返回数据,但保持上下文不变,直到在方法末尾处理完为止。另一方面,示例2将在数据库调用完成后立即调用Dispose(除非强制进入内存,例如在
IEnumerable
上使用
.ToList()
)。如果我的理解不正确,请在适当的地方纠正我

所以我的主要问题是,使用一种方法比使用另一种方法有哪些缺点和优点?例如,与示例1相比,使用示例2是否有更大的性能开销


仅供参考:我试图搜索以下问题的答案,但未成功,因此,如果您有类似问题,请随时向我指出该方向。

您的第二个示例未使用实体框架。这里似乎有两种不同的数据访问方法,尽管很难从存储库片段中分辨出来,因为它完全正确地隐藏了数据访问实现。第二个示例正确地使用了“using”语句,正如您应该在实现IDisposable的任何对象上使用的那样。这意味着你不必担心打电话。这是使用纯ADO.net,这是实体框架在后台使用的

如果第一个示例使用的是实体框架,那么很可能是延迟加载,在这种情况下,需要DbContext一直保持到执行查询为止。实体框架是一种ORM工具。它也在后台使用ADO.net连接到数据库,但它也为您提供了更多的功能。一本关于这两个主题的好书应该对你有所帮助

我发现学习ADO.net首先有助于理解实体框架如何从数据库检索信息

using语句是一种很好的实践,只要您找到一个实现IDisposable的对象。您可以在此处阅读更多有关内容:

在回答问题的变化时,答案大体上保持不变。就性能而言,查询返回的速度有多快?其中一个的性能比另一个好吗?只有您当前的系统和设置才能告诉您这一点。这两种方法似乎都是正确的

我还没有使用过迁移,所以我不知道为什么会有ADO.net类型的查询与EF模型集成,但我不会对这个功能感到惊讶。根据我的经验,实体框架为您创建查询,然后使用第二个示例中的ADO.net对象执行查询。关键的一点是,您希望拥有SqlConnection和SqlCommand对象的“using”块(尽管我认为您不需要嵌套它们。外部“using”块中的所有内容都将被释放)


没有什么能阻止你“使用”“在您的存储库中围绕上下文进行阻塞,但当涉及到延迟加载相关实体时,您将得到一个错误,因为上下文已被释放。如果需要进行此更改,可以在查询中包含相关元素,并取消延迟加载方法。在某些情况下,这样做会提高性能,但您需要根据系统的性能来平衡这一点。

您的第二个示例没有使用实体框架。这里似乎有两种不同的数据访问方法,尽管很难从存储库片段中分辨出来,因为它完全正确地隐藏了数据访问实现。第二个示例正确地使用了“using”语句,正如您应该在实现IDisposable的任何对象上使用的那样。这意味着你不必担心打电话。这是使用纯ADO.net,这是实体框架在后台使用的

如果第一个示例使用的是实体框架,那么很可能是延迟加载,在这种情况下,需要DbContext一直保持到执行查询为止。实体框架是一种ORM工具。它也在后台使用ADO.net连接到数据库,但它也为您提供了更多的功能。一本关于这两个主题的好书应该对你有所帮助

我发现学习ADO.net首先有助于理解实体框架如何从数据库检索信息

using语句是一种很好的实践,只要您找到一个实现IDisposable的对象。您可以在此处阅读更多有关内容:

在回答问题的变化时,答案大体上保持不变。就性能而言,查询返回的速度有多快?其中一个的性能比另一个好吗?只有您当前的系统和设置才能告诉您这一点。这两种方法似乎都是正确的

我还没有使用过迁移,所以我不知道为什么会有ADO.net类型的查询与EF模型集成,但我不会对这个功能感到惊讶。根据我的经验,实体框架为您创建查询,然后使用第二个示例中的ADO.net对象执行查询。关键的一点是,您希望拥有SqlConnection和SqlCommand对象的“using”块(尽管我不认为您需要
using (SqlConnection connection = new SqlConnection(
        ConfigurationManager.ConnectionStrings["ConnectionName"].ToString()))
{
    var storedProcedureName = GetStoredProcedureName();

    using (SqlCommand command = new SqlCommand(storedProcedureName, connection)) 
    {
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add("@Start", SqlDbType.Int).Value = start;

        using (SqlDataReader reader = command.ExecuteReader())
        {
            // DATA IS READ AND PARSED
        }
    }
}