Не удается выполнить хранимую процедуру с помощью 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 ответов
сначала вы добавляете его в модель, затем переходите к контейнеру сущностей, затем импортируете функцию.
все подробности здесь:
спасибо, 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);
для дальнейших запросов, посетите
Я не думаю, что вы можете добавить хранимую процедуру в модель 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 вернуть некоторый набор столбцов, которые соответствуют определению сущности.