Подтвердить что ты не робот

Как вызвать хранимые процедуры с помощью EntityFramework?

Я создал модель EF4 из базы данных MySQL, и я включил как StoredProcedures, так и таблицы.

Я знаю, как делать регулярные операции instert/update/fetch/delete с EF, но я не нахожу свои StoredProcedures?

Именно это я и надеялся:

using (Entities context = new Entities())
{
    context.MyStoreadProcedure(Parameters); 
}

Изменить 1:

Вот как это выглядело без EF:

sqlStr = "CALL updateGame(?,?,?,?,?,?,?)";

commandObj = new OdbcCommand(sqlStr, mainConnection);
commandObj.Parameters.Add("@id,", OdbcType.Int).Value = inGame.id;
commandObj.Parameters.Add("@name", OdbcType.VarChar, 255).Value = inGame.name;
commandObj.Parameters.Add("@description", OdbcType.Text).Value = ""; //inGame.description;
commandObj.Parameters.Add("@yearPublished", OdbcType.DateTime).Value = inGame.yearPublished;
commandObj.Parameters.Add("@minPlayers", OdbcType.Int).Value = inGame.minPlayers;
commandObj.Parameters.Add("@maxPlayers", OdbcType.Int).Value = inGame.maxPlayers;
commandObj.Parameters.Add("@playingTime", OdbcType.VarChar, 127).Value = inGame.playingTime;    

return Convert.ToInt32(executeScaler(commandObj));

PS. Я могу изменить версию EF при необходимости

Изменить 1:

CREATE DEFINER=`106228`@`%` PROCEDURE `updateGame`(

inId INT,

inName VARCHAR(255),

inDescription TEXT,

inYearPublished DATETIME,

inMinPlayers INT,

inMaxPlayers INT,

inPlayingTime VARCHAR(127)

)
4b9b3361

Ответ 1

Один из способов - использовать свойство Database без DbContext:

SqlParameter param1 = new SqlParameter("@firstName", "Frank");
SqlParameter  param2 = new SqlParameter("@lastName", "Borland");
context.Database.ExecuteSqlCommand("sp_MyStoredProc @firstName, @lastName", 
                              param1, param2);

EF5 определенно поддерживает это.

Ответ 2

Вы используете функцию SqlQuery и указываете сущности на отображение результата.

Присылаю пример, чтобы выполнить это:

var oficio= new SqlParameter
{
    ParameterName = "pOficio",
    Value = "0001"
};

using (var dc = new PCMContext())
{
    return dc.Database
             .SqlQuery<ProyectoReporte>("exec SP_GET_REPORTE @pOficio",
                                        oficio)
             .ToList();
}

Ответ 3

Как только ваша хранимая процедура будет импортирована в вашу модель, вы можете щелкнуть ее правой кнопкой мыши (из браузера модели в разделе Context.Store/Stored Procedures) и нажмите Add Function Import. Если вам нужен сложный тип, вы можете создать его прямо там.

Ответ 4

В соответствии с исходным запросом OP, чтобы иметь возможность вызвать хранимую процедуру, такую ​​как...

using (Entities context = new Entities())
{
    context.MyStoreadProcedure(Parameters); 
}

Бесшумный пассажир имеет проект, который позволяет вам вызывать сохраненную proc из работы фрейма объекта, как это....

using (testentities te = new testentities())
{
    //-------------------------------------------------------------
    // Simple stored proc
    //-------------------------------------------------------------
    var parms1 = new testone() { inparm = "abcd" };
    var results1 = te.CallStoredProc<testone>(te.testoneproc, parms1);
    var r1 = results1.ToList<TestOneResultSet>();
}

... и я работаю над структурой хранимых процедур (здесь), которые вы можете назвать как в одном из моих методов тестирования, показанных ниже...

[TestClass]
public class TenantDataBasedTests : BaseIntegrationTest
{
    [TestMethod]
    public void GetTenantForName_ReturnsOneRecord()
    {
        // ARRANGE
        const int expectedCount = 1;
        const string expectedName = "Me";

        // Build the paraemeters object
        var parameters = new GetTenantForTenantNameParameters
        {
            TenantName = expectedName
        };

        // get an instance of the stored procedure passing the parameters
        var procedure = new GetTenantForTenantNameProcedure(parameters);

        // Initialise the procedure name and schema from procedure attributes
        procedure.InitializeFromAttributes();

        // Add some tenants to context so we have something for the procedure to return!
        AddTenentsToContext(Context);

        // ACT
        // Get the results by calling the stored procedure from the context extention method 
        var results = Context.ExecuteStoredProcedure(procedure);

        // ASSERT
        Assert.AreEqual(expectedCount, results.Count);
    }
}

internal class GetTenantForTenantNameParameters
{
    [Name("TenantName")]
    [Size(100)]
    [ParameterDbType(SqlDbType.VarChar)]
    public string TenantName { get; set; }
}

[Schema("app")]
[Name("Tenant_GetForTenantName")]
internal class GetTenantForTenantNameProcedure
    : StoredProcedureBase<TenantResultRow, GetTenantForTenantNameParameters>
{
    public GetTenantForTenantNameProcedure(
        GetTenantForTenantNameParameters parameters)
        : base(parameters)
    {
    }
}

Если любой из этих двух подходов хорош?

Ответ 5

Это то, что я недавно сделал для своего приложения для визуализации данных, которое имеет базу данных SQL 2008. В этом примере я получаю список, возвращенный из хранимой процедуры:

public List<CumulativeInstrumentsDataRow> GetCumulativeInstrumentLogs(RunLogFilter filter)
    {
        EFDbContext db = new EFDbContext();
        if (filter.SystemFullName == string.Empty)
        {
            filter.SystemFullName = null;
        }
        if (filter.Reconciled == null)
        {
            filter.Reconciled = 1;
        }
        string sql = GetRunLogFilterSQLString("[dbo].[rm_sp_GetCumulativeInstrumentLogs]", filter);
        return db.Database.SqlQuery<CumulativeInstrumentsDataRow>(sql).ToList();
    }

И затем этот метод расширения для некоторого форматирования в моем случае:

public string GetRunLogFilterSQLString(string procedureName, RunLogFilter filter)
        {
            return string.Format("EXEC {0} {1},{2}, {3}, {4}", procedureName, filter.SystemFullName == null ? "null" : "\'" + filter.SystemFullName + "\'", filter.MinimumDate == null ? "null" : "\'" + filter.MinimumDate.Value + "\'", filter.MaximumDate == null ? "null" : "\'" + filter.MaximumDate.Value + "\'", +filter.Reconciled == null ? "null" : "\'" + filter.Reconciled + "\'");

        }

Ответ 6

В основном вам просто нужно сопоставить процедуру с сущностью, используя сохранение хранимых процедур.

После сопоставления вы используете обычный метод для добавления элемента в EF, и вместо этого он будет использовать вашу хранимую процедуру.

Пожалуйста, смотрите: Эта ссылка для пошагового руководства. Результатом будет добавление объекта вроде этого (который фактически будет использовать вашу хранимую процедуру).

using (var ctx = new SchoolDBEntities())
        {
            Student stud = new Student();
            stud.StudentName = "New sp student";
            stud.StandardId = 262;

            ctx.Students.Add(stud);
            ctx.SaveChanges();
        }