Voici comment j'ai résolu ce problème en utilisant un fichier EDMX. Cette solution change le modèle T4 par défaut pour que la classe générée hérite d'une classe DbContext personnalisée, qui spécifie un délai de commande par défaut, et une propriété pour le modifier.
J'utilise Visual Studio 2012 et EF 5.0. Votre expérience peut être différente avec d'autres versions.
Créer une classe DbContext personnalisée
public class CustomDbContext : DbContext
{
ObjectContext _objectContext;
public CustomDbContext( string nameOrConnectionString )
: base( nameOrConnectionString )
{
var adapter = (( IObjectContextAdapter) this);
_objectContext = adapter.ObjectContext;
if ( _objectContext == null )
{
throw new Exception( "ObjectContext is null." );
}
_objectContext.CommandTimeout = Settings.Default.DefaultCommandTimeoutSeconds;
}
public int? CommandTimeout
{
get
{
return _objectContext.CommandTimeout;
}
set
{
_objectContext.CommandTimeout = value;
}
}
}
Il s'agit d'une fonction optionnelle : Je ne code pas en dur le délai de commande par défaut. Au lieu de cela, je le charge à partir des paramètres du projet afin que je puisse changer la valeur dans un fichier de configuration. La façon de configurer et d'utiliser les paramètres du projet n'entre pas dans le cadre de cette réponse.
Je ne fais pas non plus de codage en dur de la chaîne de connexion ou du nom de la chaîne de connexion. Ils sont déjà passés dans le constructeur par la classe de contexte générée, il n'y a donc aucun sens à les coder en dur ici. Il n'y a rien de nouveau ; le fichier EDMX génère déjà le constructeur suivant pour vous, donc nous ne faisons que transmettre la valeur.
public MyEntities()
: base("name=MyEntities")
{
}
(Ceci indique à EF de charger la chaîne de connexion nommée "MyEntities" depuis le fichier de configuration).
Je lève une exception personnalisée si le fichier ObjectContext
est toujours nulle. Je ne pense pas qu'il le sera un jour, mais c'est plus significatif que d'obtenir un message de type NullReferenceException
.
Je stocke les ObjectContext
dans un champ afin que je puisse créer une propriété pour y accéder et remplacer la valeur par défaut.
Modifier le contexte de l'entité Modèle T4
Dans l'explorateur de solutions, développez le fichier EDMX de manière à voir les modèles T4. Ils portent une extension .tt.
Double-cliquez sur le fichier "MyModel.Context.tt" pour l'ouvrir. A la ligne 57, vous devriez voir ceci :
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
Cette ligne de modèle génère la définition de votre classe "MyEntities", qui hérite de DbContext.
Changez la ligne pour que la classe générée hérite de CustomDbContext, à la place :
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : CustomDbContext
Dès que vous enregistrez ce fichier, la classe est régénérée. Si ce n'est pas le cas, vous pouvez cliquer avec le bouton droit de la souris sur le fichier EDMX et sélectionner "Run Custom Tool". Si vous développez le fichier "MyModel.Context.tt" sous votre fichier EDMX, vous verrez "MyModel.Context.cs". C'est le fichier généré. Ouvrez-le, et vous devriez voir qu'il hérite maintenant des éléments suivants CustomDbContext
.
public partial class MyEntities : CustomDbContext
C'est tout ce qu'il y a à faire.
Questions
Une fois que vous avez changé la classe de contexte de DbContext
a CustomDbContext
Si vous essayez d'ajouter une nouvelle classe de contrôleur MVC en utilisant le modèle "Controller with read/write actions and views, using Entity Framework", Visual Studio vous donnera une erreur. Il vous dira "Unsupported context type.". Pour contourner ce problème, ouvrez la classe générée "MyModel.Context.cs" et changez temporairement le type dont elle hérite en DbContext
. Après avoir ajouté votre nouveau contrôleur, vous pouvez le changer à nouveau en CustomDbContext
.