Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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#_Vb.net_Linq To Sql_Entity Framework_Stored Procedures - Fatal编程技术网

C# 实体框架和存储过程

C# 实体框架和存储过程,c#,vb.net,linq-to-sql,entity-framework,stored-procedures,C#,Vb.net,Linq To Sql,Entity Framework,Stored Procedures,我注意到在实体框架设计器中,您可以映射用于插入、更新和删除操作的存储过程。对于Select操作是否也有这样做的方法,或者对于数据库访问代码是否有一个新的方向,我们不再为基本的Select操作编写存储过程 我工作的公司非常坚持在每次数据库操作中都使用存储过程,即使实体框架通过调用sp_executesql使调用安全 看起来LINQtoSQL和EntityFramework都不再使用存储过程来选择数据了。这是准确的说法吗 我想澄清一下我的问题: 我的数据库中有一个名为Product的表。我使用实体框

我注意到在实体框架设计器中,您可以映射用于插入、更新和删除操作的存储过程。对于Select操作是否也有这样做的方法,或者对于数据库访问代码是否有一个新的方向,我们不再为基本的Select操作编写存储过程

我工作的公司非常坚持在每次数据库操作中都使用存储过程,即使实体框架通过调用sp_executesql使调用安全

看起来LINQtoSQL和EntityFramework都不再使用存储过程来选择数据了。这是准确的说法吗

我想澄清一下我的问题:

我的数据库中有一个名为Product的表。我使用实体框架中的向导来生成我的模型…所以我现在有了一个名为Product的实体。当我执行以下查询时:

db.Products.SingleOrDefault(p => p.Id == 1);
它生成的代码类似于:

EXEC sp_executesql N'SELECT * FROM Product'
当我真的想做以下事情时:

EXEC up_GetProduct @Id = 1
如果使用SingleOrDefault无法做到这一点,我可以接受。我宁愿有以下几点:

db.Products.GetProduct(1);

这是正常的做法还是大多数人只是让它动态生成SQL?

您当然可以在实体框架中使用存储过程进行选择。我在EF4和存储过程方面取得了巨大成功。而且,它们也不太难设置

我将警告您一件事:如果您使用的是SQL Server 2005,如果您希望允许实体建模器为您生成复杂类型,则可能必须重新编译要在SET FMTONLY关闭的情况下使用的任何存储过程。有关这方面的更多详细信息,请参阅


有关更多信息,请参阅。

实体本身不允许存储过程进行选择。有几个原因。不经意间:

如何将where子句添加到存储过程中?您可能必须使用LINQ to对象来执行此操作,并且查询效率低下,或者以某种方式能够向存储过程属性添加自定义映射。尽管并非不可能,但它确实引入了一些实现复杂性。 实体可以具有用于在查询中进行连接的关系。对于存储过程,您再次遇到类似的问题。如果您有Order和OrderItem表,如何联接?您可以运行SelectOrder,并为每个订单运行SelectOrderItem 1+n查询,或者有一个存储过程以一个结果集(包含重复的订单数据)或两个结果集的形式返回这两个结果。然后您必须指定如何映射到实体。如果必须手动指定映射,则无法实现必须设置的实体关系的目的。 你是怎么做的?使用LINQtoEntities,您可以向业务层或UI层公开IQueryable。然后执行LINQ过滤,这会修改SQL并提高效率。对于存储过程,您将不得不再次以某种方式手动定义所有这些,或者使用LINQ to对象进行过滤。 LINQ允许您选择新的{o.Column1,o.Column2}。这将生成只选择所需的那两列的SQL。如果您有BLOB/VARCHARMAX,则非常有用。对于存储过程,通常返回的每一列在许多方面都是浪费的。您可以分为GetOrderDetailMain和GetOrderDetailImages或类似的存储过程,但无法创建每个组合。 在我看来,如果你要使用EF框架,让它为你做CRUD。将存储过程用于复杂的逻辑,如全文搜索、速度太慢的特定查询等。否则,您将不会从中获得太多好处


编辑:当然,存储过程也有好处。它们是经过准备/预编译的、定义良好的数据库API,虽然使用SP CRUD,您不需要授予对表的访问权限,但实际上您可以执行相同的操作,更容易调试/调优查询,更容易知道要调优的查询,可以执行批处理等。不过,对于简单的CRUD,您必须问问自己,花时间实现/管理存储过程的开销是否值得。

我已经完成了快速入门。我没有看到任何关于使用存储过程选择数据的内容。嗯,这里非常缺乏快速入门。尝试此页面,它似乎有一组更全面的链接: