Не удается выполнить хранимую процедуру с помощью ADO.NET Entity Framework

Я создал простую без параметров хранимую процедуру, которую я вставил ниже. Я импортировал хранимую процедуру в модель сущности и создал импорт функции. Функция в модели никогда не создается, и я не могу выполнить эту хранимую процедуру, используя ADO.NET Entity Framework. Я открыла .edmx-файл в XML-представлении и подтвердил отсутствие ошибок в отношении этой хранимой процедуры. Что я делаю не так? Действительно ли невозможно назвать такой простой сохраненный процедура из Entity Framework? Я установил тип возврата для функции импорта в 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 ответов


сначала вы добавляете его в модель, затем переходите к контейнеру сущностей, затем импортируете функцию.

все подробности здесь:

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


спасибо, pmarflee.

Я на самом деле пришел сюда, чтобы опубликовать свое решение об этом и увидел ваш ответ в то же время. Этот код фактически использует соединение entity framework и выполняет хранимую процедуру, импортированную в модель. Microsoft продолжает подталкивать нас разработчиков использовать 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
'==

любая хранимая процедура может быть вызвана через EF. Создайте SP и добавьте его в свою модель. Далее перейдите в браузер моделей, щелкните правой кнопкой мыши sp и выберите Добавить импорт функций, здесь выберите SP и выберите тип, который он возвращает, если он ничего не возвращает, выберите "Нет". Если он возвращает тип sclar, выберите тип, А если он возвращает набор записей, выберите complex. Нажмите на Получить информацию о столбце, он покажет вам colums возвращения. нажмите Создать новый сложный тип. и нажмите кнопку ОК. Если он возвращает одну из вас сущностей, нажмите на опцию entity и выберите тип сущности из списка.

теперь вы вызываете его в своем коде.

Если возвращается сложный тип используйте код:

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/


Я не думаю, что вы можете добавить хранимую процедуру в модель EF, если она не связана с определенной операцией CRUD на объекте. Однако вы можете ссылаться на подключение свойство объекта контейнера сущности для доступа к базовому ADO.NET объект подключения, который использует EF. Затем вы можете вызвать хранимую процедуру с помощью traditional ADO.NET код.


в случае, если кто-то еще удивляется этому...

основная проблема с хранимыми процессами и Entity Framework заключается в том, что возвращаемые типы должны быть определены. Например, если у вас есть сохраненный proc, который возвращает строки soem из таблицы, Entity Framework необходимо сообщить, как выглядит структура этих строк. Это необходимо, чтобы он мог генерировать все прокси-классы и сериализовать и десериализовать вещи.

когда вы идете к модели - rigkt нажмите-inport функция, вы можете выбрать сохраненный proc, но он ожидает, что возвращаемые типы будут none, scalar или entity types (e.e. на основе таблиц в вашей базе данных). Вы можете, если хотите, добавить сложный тип. Щелкните правой кнопкой мыши модель-выберите add-Complex type. Затем определяются столбцы и их типы данных.

Как только это будет сделано, класс, который вы только что создали, появится в списке типов сущностей, упомянутых выше.


для моего проекта я фактически использую БД FirebirdSql, я не знаю, действительно ли это правильно для Entity Framework, так как я использовал его, дайте мне некоторые проблемы, и это не так эффективно.

но в любом случае, если я (функций) импортировать хранимую процедуру с операции вставки внутри, по какой-то причине ничего не происходит. Другими словами, если я добавлю в свою модель (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();

на самом деле ничего не происходит. Ничего все. Ни исключения, ни результаты, ни вставки, все идеально, никаких предупреждений нет ошибок компиляции. Самое смешное, что если я помещаю delete в скрипт хранимой процедуры, удаление работает!! Но никаких вставок!

таблица очень проста, как показано, и я уже импортировал другие хранимые процедуры, и они работают, но поскольку они содержат запросы, обновления и удаление, в случае, если они получили insert... ни за что! Может быть, это ошибка в Firebird Ado.NET провайдер? Или я должен установить я что-то пропустил?


Если вы хотите избежать использования DBCommand, я заставил его работать, заставив SP вернуть некоторый набор столбцов, которые соответствуют определению сущности.