Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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
无法使用ADO.NET实体框架执行存储过程_.net_Vb.net_Entity Framework_Stored Procedures_Ado.net - Fatal编程技术网

无法使用ADO.NET实体框架执行存储过程

无法使用ADO.NET实体框架执行存储过程,.net,vb.net,entity-framework,stored-procedures,ado.net,.net,Vb.net,Entity Framework,Stored Procedures,Ado.net,我创建了一个简单的无参数存储过程,粘贴在下面。我已经将存储过程导入实体模型,并创建了一个函数导入。模型中的函数从未创建,我无法使用ADO.NET实体框架执行此存储过程。我已经在XML视图中打开了.edmx文件,并确认没有关于此存储过程的错误。我做错了什么?从实体框架调用如此简单的存储过程真的不可能吗?我已将导入函数的返回类型设置为“无”,因为此存储过程不需要返回任何记录集或值 存储过程: ALTER PROC [dbo].[Inventory_Snapshot_Create] AS SET

我创建了一个简单的无参数存储过程,粘贴在下面。我已经将存储过程导入实体模型,并创建了一个函数导入。模型中的函数从未创建,我无法使用ADO.NET实体框架执行此存储过程。我已经在XML视图中打开了.edmx文件,并确认没有关于此存储过程的错误。我做错了什么?从实体框架调用如此简单的存储过程真的不可能吗?我已将导入函数的返回类型设置为“无”,因为此存储过程不需要返回任何记录集或值

存储过程:

ALTER PROC [dbo].[Inventory_Snapshot_Create]

AS

SET NOCOUNT ON

DECLARE @Inventory_Snapshot_ID int

INSERT INTO Inventory_Snapshots (snapshot_timestamp)
VALUES (GETDATE())

SET @Inventory_Snapshot_ID = SCOPE_IDENTITY()

INSERT INTO Inventory_Snapshot_Products (inventory_snapshot_id,
    idProduct, stock)

    SELECT @Inventory_Snapshot_ID, idProduct, stock
    FROM products


SET NOCOUNT OFF
试图执行存储过程的代码:

Dim db As New MilkModel

db.Inventory_Snapshot_Create()

我认为不能将存储过程添加到EF模型中,除非它与实体上的特定CRUD操作相关联。但是,您可以引用实体容器对象的Connection属性来访问EF正在使用的底层ADO.NET连接对象。然后,您可以使用传统的ADO.NET代码调用存储过程。

谢谢,pmarflee

事实上,我是来这里发布我的决议的,同时也看到了你们的反应。这段代码实际上使用实体框架的连接并执行我导入到模型中的存储过程。微软一直在敦促美国开发人员使用实体框架,而不是LINQtoSQL和其他DAL生成器,但EF实际上根本不需要。在它成为一个更完整的解决方案之前,我不会在未来的项目中使用它

下面是我最后做的:

Dim db As New MilkModel

'==
'Begin dirty hack to execute parameterless/resultless stored
'procedure using Entity Framework (well, sort of using EF). 
'http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/44a0a7c2-7c1b-43bc-98e0-4d072b94b2ab/
'==
Dim con As DbConnection = db.Connection

con.Open()

Dim cmd As DbCommand = con.CreateCommand()

With cmd
    .CommandType = CommandType.StoredProcedure
    .CommandText = "MilkModel.Inventory_Snapshot_Create"
    .ExecuteNonQuery()
    .Dispose()
End With

con.Dispose()
'==
'End dirty hack
'==

首先将其添加到模型中,然后转到实体容器,然后导入函数

详情如下:


如果希望避免使用DBCommand,我让SP返回一些与实体定义匹配的列集,从而使其工作。

任何存储过程都可以通过EF调用。创建SP并将其添加到模型中。进一步转到模型浏览器,右键单击sp,然后单击“添加函数导入”,在此处选择您的sp,并选择它返回的类型,如果它不返回任何内容,则选择“无”。如果返回sclar类型,则选择该类型;如果返回记录集,则选择complex。单击获取列信息,它将显示返回的列。单击创建新的复杂类型。然后单击ok。如果返回一个实体,则单击选项实体并从列表框中选择实体类型

现在在代码中调用它

如果返回复杂类型,请使用代码:


MyEntities_entities=新的MyEntities();
var p=从_entities.GetOrderInfo()中的d选择d;

如果不返回任何内容,则使用代码:

MyEntities_entities=新的MyEntities();
_实体。取消销售(ucode、oid);

如有进一步查询,请访问


万一有人对此感到好奇

存储过程和实体框架的主要问题是需要定义返回类型。例如,如果您有一个从表中返回soem行的存储过程,则需要告诉实体框架这些行的结构是什么样的。它需要这样做,以便能够生成所有代理类并序列化和反序列化

当您转到model-rigkt click-inport函数时,您可以选择一个存储的过程,但它期望返回类型为none、scalar或entity类型(例如,基于数据库中的表)。如果愿意,可以添加复杂类型。右键单击“模型”-选择“添加”-“复杂类型”。然后定义列及其数据类型


完成后,您刚才创建的类将显示在上面提到的实体类型列表下。

对于我的项目,我实际上使用的是FirebirdSql数据库,我不知道它是否真的适合实体框架,因为我使用它会给我带来一些问题,而且性能不太好

但无论如何,如果我(函数)导入一个存储过程,其中包含一些插入操作,出于某种原因,什么也不会发生。换句话说,如果我在我的模型(EDCX)中添加以下SP:

然后我这样称呼它:

FirebirdContext.InsertStuff("Hi there!"); // it should return an ObjectResult<String>
FirebirdContext.SaveChanges();
FirebirdContext.InsertStuff(“你好!”);//它应该返回一个ObjectResult
FirebirdContext.SaveChanges();
其实什么都没发生。什么都没有。无论是异常、结果还是插入,一切都是完美的,没有警告,没有编译错误。有趣的是,如果我在存储过程脚本中添加了delete,那么delete就可以工作了!!但是没有插页


该表非常简单,如图所示,我已经导入了其他存储过程,它们也可以工作,但因为它们包含查询、更新和删除,所以在得到insert的情况下。。。不可能!这可能是Firebird Ado.NET提供程序中的错误吗?还是我必须设置我错过的内容?

谢谢您的帮助,我也不相信您不能通过这个调用存储过程。但正如pmarflee所说,其理由是,如果您正在修改EF中的表,那么您就不应该使用它。无需进行黑客攻击。请看:这是完全正确的。这里不需要恶意攻击-你只需要阅读文档。如果你使用EF5以后的版本,没有函数导入,你可以直接访问它们,而不需要函数导入。
FirebirdContext.InsertStuff("Hi there!"); // it should return an ObjectResult<String>
FirebirdContext.SaveChanges();