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; }
}
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());
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>();
}
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();
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?
// 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);
}
Simple. Instanciez simplement votre entity, définissez-le à un objet et passez-le à votre vue dans votre controller.
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);
}
}