C# 通过EF上下文查询数据库与通过Web API查询数据库之间的区别

C# 通过EF上下文查询数据库与通过Web API查询数据库之间的区别,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我目前有一个WinForms应用程序,它使用实体框架与本地网络上的SQL数据库通信。这很好,因为我可以创建一个数据库上下文,然后使用LINQ来操作我的数据 我正在构建一个MVC应用程序,该应用程序将托管在不同的位置,但需要访问WinForms应用程序使用的相同数据库。我希望我可以通过Web API公开数据,但在我开始这么做的时候,似乎我必须构建URL来从API返回我需要的数据,而不是像我习惯的那样通过上下文对象进行通信 例如,如果我想获得用户当前的所有角色,我可以执行以下操作: var role

我目前有一个WinForms应用程序,它使用实体框架与本地网络上的SQL数据库通信。这很好,因为我可以创建一个数据库上下文,然后使用LINQ来操作我的数据

我正在构建一个MVC应用程序,该应用程序将托管在不同的位置,但需要访问WinForms应用程序使用的相同数据库。我希望我可以通过Web API公开数据,但在我开始这么做的时候,似乎我必须构建URL来从API返回我需要的数据,而不是像我习惯的那样通过上下文对象进行通信

例如,如果我想获得用户当前的所有角色,我可以执行以下操作:

var roles = from u in ctx.user where u.Id == 1 select u.Roles;

如果我理解正确,如果使用Web API,我必须使用所有参数构造URL,使用HttpContext创建HTTP请求,然后从响应中获取结果。这是正确的吗

webapi只是创建Web服务的一种简单方法。您不一定需要在URL中包含参数,您可以使用HTTP post并在请求正文中包含参数,但您将无法像使用Entity Framework那样在web方法上运行LINQ查询。

您基本上是正确的。使用WebAPI在这里添加了一个附加层。很好的一点是,您可以将大量逻辑从应用程序移动到API层,并且可以更清晰地分离关注点。这意味着您可以添加与同一Web API对话的其他客户端(可能不支持EF,或者甚至可能不基于.NET,如iPhone应用程序)


注意,不一定是包含参数的URL,它们可以在请求体中。当您提供强类型参数时,它可以自动为您创建请求。您不使用HttpContext(这对于服务器端来说是ASP.NET,而不是客户端)。

我建议将“数据层”提取出来。如果所有EF调用都是在新提取的数据层中完成的,那么可以对两个项目使用相同的调用。创建一个新项目并从此层执行所有调用。看

现在,通过提取该层,您可以执行任何操作。您可以使用web api调用存储库层中的各个方法,也可以使用内置的MVC ActionResults来处理此问题


旁注:您可能需要研究它,它将使过程更容易、更顺畅。

实体框架
Web API
无关。您可以使用
DbContext
,也可以使用服务与数据库通信。也许你的印象是错误的,因为
Web API
通常用于
SOA
应用程序。@Leron我想他是在问为什么你会选择实现Web API而不是直接访问数据库(在这种情况下使用EF,但也可能通过ADO.NET)。请注意:您应该将数据库逻辑移出客户端(WinForms app)-数据库登录和密码可以反向工程(因为数据是二进制的)。@mason我仍然看不到任何连接,我认为OP出了一些问题。现在我正在做一个项目,我使用
ashx
文件作为Http处理程序,我清楚地看到
webapi
的威力所在——当你需要处理loft
Http
请求/响应时,但当你在服务器端时,假设
Web API
控制器根据您的项目设计使用
EF
或您需要的任何东西都没有问题。@mason直接访问数据库不是一个选项,这就是我想通过Web API公开EF模型的原因。Leron-EF在严格意义上可能与WebAPI没有任何关系,但在我的实现中确实如此。我为模型数据库创建了一个EF模型,然后为模型中的每个对象构建了控制器(本例中为数据库中的表)。也许我只是被宠坏了,无法通过上下文处理数据,轻松查询我想要的内容,进行更改,然后调用ctx.SaveChanges()更新数据库。看起来使用Web API我还有很多工作要做。为什么
Web API
会改变
实体框架的行为?您所说的附加层指的是
Http处理程序
,而不是您处理数据库的方式。如果
webapi
确实与
实体框架
有关,那么我们在分离关注点方面会有问题。你不觉得吗?@Leron我觉得你很困惑。或者你试图提出一些让情况变得混乱的观点。Web API不会改变EF的行为。它是一个服务器端库,用于通过HTTP连接接收呼叫并返回响应。要处理这些响应并生成请求,可能需要一些数据访问,Web API服务器可以使用EF或ADO.NET或任何其他数据访问技术。@mason您说过“您不使用HttpContext(这是服务器端的ASP.NET内容,而不是客户端)。”如果我的客户端是.NET应用程序,那就不是这样了,是吗?如果是这样的话,我怎么从.NET客户端调用API呢?@FDRob您不在客户端使用HttpContext。根据客户端的不同,它将提供不同的请求和响应对象。请参阅我答案中的链接。@mason是的,对不起……我一直在说HttpContext,但我想说的是HttpClient。