Structure d'entité ASP.Net, erreur objectcontext
Je suis en train de construire un 4 couches ASP.Net application web.
Les couches sont:
- Couche De Données
- Entité De La Couche De
- De La Couche De Gestion
- Couche d'INTERFACE utilisateur
L'entité de la couche de mes données ont des classes de modèle et est construit à partir de mon modèle de données d'entité (fichier edmx) dans le datalayer à l'aide de modèles de T4 (POCO). L'entité de la couche est référencé dans toutes les autres couches.
Ma couche de données dispose d'une classe appelée SourceKeyRepository qui a une fonction comme ceci:
public IEnumerable<SourceKey> Get(SourceKey sk)
{
using (dmc = new DataModelContainer())
{
var query = from SourceKey in dmc.SourceKeys
select SourceKey;
if (sk.sourceKey1 != null)
{
query = from SourceKey in query
where SourceKey.sourceKey1 == sk.sourceKey1
select SourceKey;
}
return query;
}
}
Lazy loading est désactivé car je ne veux pas que mes requêtes à exécuter dans les autres couches de la présente demande. Je reçois l'erreur suivante lorsque vous essayez d'accéder à l'information dans la couche d'INTERFACE utilisateur:
ObjectContext instance a été
éliminés et ne peuvent plus être utilisés pour
des opérations qui nécessitent une connexion.
Je suis sûr que c'est parce que mon DataModelContainer "dmc" a été éliminé. Comment puis-je retourner cet objet IEnumerable de ma couche de données de sorte qu'il ne repose pas sur la ObjectContext, mais uniquement sur le modèle de données?
Est-il un moyen de limiter le chargement paresseux pour se produire uniquement dans la couche de données?
source d'informationauteur Chris Klepeis
Vous devez vous connecter pour publier un commentaire.
query
est paresseux évalué si les données ne sont pas récupérées à partir de la base de données jusqu'à ce que vous énumérez.Si vous n':
vous aurez la force d'exécuter la requête et d'éviter le problème.
Vous recevez le message d'erreur car lorsque l'appelant énumère la collecte, l'ObjectContext (
dmc
) est déjà éliminés grâce à votreusing
clause (qui est de bonne disposer de la base de données de ressources liées à l'avance!)Modifier
Dans le post original, j'ai utilisé
AsEnumerable()
j'ai pensé que c'était correct jusqu'à récemment, j'ai essayé de l'utiliser dans cette situation exacte de moi-même.AsEnumerable()
fait seulement au moment de la compilation de conversion de type - il n'a pas d'énumérer. Pour forcer la requête pour être énumérés, il doit être enregistré dans unList
ou d'autres de la collection.On pourrait appeler une méthode sur la
query
objet, par exempleQui devrait assurez-vous que vous exécutez la requête, afin de s'assurer que vous n'avez pas besoin du contexte de l'objet plus tard.
Ne pas utiliser
utilisation
avant de mettre au rebut votre contexte.
Retour AsEnumerable de ne pas exécuter la boucle foreach jusqu'à ce que l'objet est référencé. Conversion d'un tableau en assure le foreach s'exécute avant que votre objet est supprimé. Vous pouvez mettre votre cadre en utilisant le bloc (quelque chose que vous devriez faire).
À mon avis, ce scénario n'a pas de pertinence avec AsEnumerable() ou AsQueryable(). Essayez ceci;
}
Et vous devez obtenir cette propriété avec