首页 文章

无法使用ADO.NET Entity Framework执行存储过程

提问于
浏览
9

我创建了一个简单的无参数存储过程,我在下面粘贴了它 . 我已将存储过程导入到我的实体模型并创建了一个Function Import . 永远不会创建模型中的函数,我无法使用ADO.NET实体框架执行此存储过程 . 我已在XML视图中打开.edmx文件,并确认此存储过程没有错误 . 我究竟做错了什么?是否真的不可能从实体框架中调用这样一个简单的存储过程?我已将导入函数的返回类型设置为None,看到此存储过程不需要返回任何记录集或值 .

存储过程:

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()

7 回答

  • 1

    首先将它添加到模型中,然后转到Entity Container,然后转到Import the function .

    详情如下:

    http://msdn.microsoft.com/en-us/library/bb896231.aspx

  • 6

    谢谢,pmarflee .

    我实际上是来这里发布我的决议并同时看到你的回复 . 此代码实际使用实体框架的连接并执行我导入到模型中的存储过程 . 微软一直在推动我们的开发人员使用Entity Framework而不是LINQ to SQL和其他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
    '==
    
  • 0

    任何存储过程都可以通过EF调用 . 创建一个SP并将其添加到您的模型中 . 进一步转到模型浏览器,右键单击sp,然后单击add function import,在这里选择你的SP,然后选择它返回的类型,如果它没有返回任何内容,则选择'None' . 如果它返回一个sclar类型,则选择类型,如果它返回一个记录集,则选择complex . 点击获取列信息,它将显示返回的列 . 单击“创建新的复杂类型” . 然后单击确定 . 如果它返回其中一个实体,则单击选项实体,然后从列表框中选择实体类型 .

    现在你打电话给你的代码 .

    如果它返回一个复杂类型使用代码:

    MyEntities _entities = new MyEntities(); var p = from d in _entities.GetOrderInfo() select d;

    如果它什么都没有返回,那么使用代码: MyEntities _entities = new MyEntities(); _entities.Cancel_Sale(ucode, oid);

    进一步查询访问

    http://dubeyniraj.blogspot.com/

  • 4

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

  • 11

    万一其他人想知道这个......

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

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

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

  • 1

    对于我的项目,我实际上使用的是FirebirdSql数据库,我不知道它是否真的适用于实体框架,因为我使用它给了我一些问题并且它不是那么高效 .

    但无论如何,如果我(函数)导入一个带有一些插入操作的存储过程,由于某种原因没有任何反应 . 换句话说,如果我添加到我的模型(EDCX)这样的SP:

    create procedure insert_stuff(thing varchar(40))
    returns response(50)
    as
    begin
        insert into stuffs(thing) values (thing);
    
        response = 'done!';
    
        suspend;
    end;
    

    然后我用这种方式调用它:

    FirebirdContext.InsertStuff("Hi there!"); // it should return an ObjectResult<String>
    FirebirdContext.SaveChanges();
    

    没有任何实际发生 . 什么都没有 . 既不是例外也不是结果也不是插入,everthing是完美的,没有警告没有编译错误 . 有趣的是,如果我删除存储过程脚本,删除工作!但没有插入!

    该表非常简单,如图所示,我已经导入了其他存储过程并且它们可以正常工作,但是因为它们包含查询,更新和删除,所以在它们插入的情况下......没办法!它可能是Firebird Ado.NET提供程序中的错误吗?或者我必须设置我错过的东西?

  • 3

    如果想避免使用DBCommand,我通过制作使其工作SP返回一些与实体定义匹配的列 .

相关问题