Невозможно выполнить хранимую процедуру с ADO.NET Entity Framework - PullRequest
9 голосов
/ 27 апреля 2009

Я создал простую хранимую процедуру без параметров, которую вставил ниже. Я импортировал хранимую процедуру в мою Entity Model и создал функцию Import. Функция в модели никогда не создается, и я не могу выполнить эту хранимую процедуру с помощью 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 ]

11 голосов
/ 07 июля 2010

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

Полная информация здесь:

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

6 голосов
/ 27 апреля 2009

Спасибо, pmarflee.

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

Любая хранимая процедура может быть вызвана через 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/

3 голосов
/ 27 апреля 2009

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

1 голос
/ 26 марта 2012

Для моего проекта я на самом деле использую БД 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();

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

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

1 голос
/ 27 июня 2011

На случай, если кто-нибудь еще удивится об этом ...

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

Когда вы переходите к функции model - rigkt click - inport, вы можете выбрать сохраненный процесс, но он ожидает, что тип возвращаемых данных будет нулевым, скалярным или типом сущности (например, на основе таблиц в вашей базе данных). Вы можете, если хотите, добавить сложный тип. Щелкните правой кнопкой мыши модель - выберите Добавить - Сложный тип. Затем вы определяете столбцы и их типы данных.

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

0 голосов
/ 15 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...