utilisation de la procédure stockée dans le cadre de l'entité

j'utilise asp.net mvc 5 and C# with Entity Framework... J'ai le modèle et les classes du domaine de la fonction... maintenant, je dois utiliser la procédure stockée.... qui j'ai du mal à le mouvement.

je suis le code première base de données existante et j'ai stocké procédure écrite là. Ma question Est de savoir comment je peux appeler cette procédure stockée dans mon application web.

procédure Stockée:

ALTER PROCEDURE [dbo].[GetFunctionByID](
    @FunctionId INT
)
AS
BEGIN
    SELECT * 
    FROM Functions As Fun
    WHERE Function_ID = @FunctionId
END

classe de domaine:

 public class Functions
 {
    public Functions()
    {
    }

    public int Function_ID { get; set; }
    public string Title { get; set; }
    public int Hierarchy_level { get; set; }
}

Fonction modèle:

[Table("Functions")]
public class App_Functions
{
    public App_Functions()
    {
    }

    [Key]
    public int Function_ID { get; set; }

    [StringLength(50)]
    [Required]
    public string Title { get; set; }

    public int Hierarchy_level { get; set; }
    //public virtual ICollection<App_Controllers> App_Controllers { get; set; }*/
}

BaseContext:

public class BaseContext<TContext> : DbContext where TContext : DbContext
{
    static BaseContext()
    {
        Database.SetInitializer<TContext>(null);
    }

    protected BaseContext()
        : base("name = ApplicationDbConnection")
    { }
}

Fonction du contexte:

public class FunctionsContext : BaseContext<FunctionsContext>
{
    public DbSet<App_Functions> Functions { get; set; }
}
33
demandé sur marc_s 2014-01-07 15:26:53

6 réponses

vous devez créer une classe model qui contient toutes les propriétés de procédure stockées comme ci-dessous. Aussi parce que la classe de modèle D'Entity Framework a besoin de la clé primaire, vous pouvez créer une fausse clé en utilisant Guid.

public class GetFunctionByID
{
    [Key]
    public Guid? GetFunctionByID { get; set; }

    // All the other properties.
}

alors inscrivez le GetFunctionByID classe model dans votre DbContext.

public class FunctionsContext : BaseContext<FunctionsContext>
{
    public DbSet<App_Functions> Functions { get; set; }
    public DbSet<GetFunctionByID> GetFunctionByIds {get;set;}
}

lorsque vous appelez votre procédure enregistrée, il suffit de voir ci-dessous:

var functionId = yourIdParameter;
var result =  db.Database.SqlQuery<GetFunctionByID>("GetFunctionByID @FunctionId", new SqlParameter("@FunctionId", functionId)).ToList());
39
répondu Lin 2014-01-07 14:16:47

après avoir importé la procédure stockée, vous pouvez créer l'objet de la procédure stockée passer le paramètre comme la fonction

using (var entity = new FunctionsContext())
{
   var DBdata = entity.GetFunctionByID(5).ToList<Functions>();
}

ou vous pouvez également utiliser SqlQuery

using (var entity = new FunctionsContext())
{
    var Parameter = new SqlParameter {
                     ParameterName = "FunctionId",
                     Value = 5
            };

    var DBdata = entity.Database.SqlQuery<Course>("exec GetFunctionByID @FunctionId ", Parameter).ToList<Functions>();
}
9
répondu user2854731 2014-07-08 21:14:12

vous pouvez appeler une procédure stockée en utilisant SqlQuery (Voir ici)

// Prepare the query
var query = context.Functions.SqlQuery(
    "EXEC [dbo].[GetFunctionByID] @p1", 
    new SqlParameter("p1", 200));

// add NoTracking() if required

// Fetch the results
var result = query.ToList();
9
répondu qujck 2014-10-20 07:28:28

passager sans cervelle a un projet qui vous permet d'appeler un proc stocké à partir d'entity frame work comme celui-ci....

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

... et je suis en train de travailler sur un procédure stockée cadre (ici) que vous pouvez appeler comme dans un de mes méthodes d'essai illustré ci-dessous...

[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)
    {
    }
}

si l'une ou l'autre de ces deux approches est bonne?

0
répondu Dib 2015-08-30 08:22:48

// Ajouter quelques locataires contexte, de sorte que nous avons quelque chose pour la procédure de retour! 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);
}
0
répondu gsgsgs 2015-10-27 10:20:06

Simple. Instanciez simplement votre entity, définissez-le à un objet et passez-le à votre vue dans votre controller.

enter image description here

Entity

VehicleInfoEntities db = new VehicleInfoEntities ();

Procédure Stockée

dbo.prcGetMakes ()

ou

vous pouvez ajouter des paramètres dans la procédure stockée à l'intérieur des parenthèses ()

dbo.prcGetMakes ("BMW")

contrôleur

public class HomeController : Controller
{
    VehicleInfoEntities db = new VehicleInfoEntities();

    public ActionResult Index()
    {
        var makes = db.prcGetMakes(null);

        return View(makes);
    }
}
0
répondu Jason Ebersey 2018-01-03 21:18:56