2010-06-22 3 views
1

il semble si je l'utilise en tant que base d'une entité d'une classe personnalisée, la ObjectContext.CreateObjectSet échouera à l'exception StackOverflowEntity Framework 4 ne prend pas en charge Motif générique Chose curieuse Récurrent

Code

est:

// This is generated by EF4 and i modify it to my custom class 
public partial class EntityA : GClass<EntityA> 
{ 
    ...... 
} 

public partial class TestEntities : ObjectContext 
{ 
    public ObjectSet<EntityA> EntityAs 
    { 
     get 
     { 
      if ((_EntityAs == null)) 
      { 
       // here will throw stackoverflow exception 
       _EntityAs = base.CreateObjectSet<EntityA>("EntityAs"); 
      } 
      return _EntityAs; 
     } 
    } 
    private ObjectSet<EntityA> _EntityAs; 
} 


// This is custom class 
public partial class EntityA 
{ 
} 

// This is my custom base class 
public class GClass<T> : EntityObject where T : class 
{ 
    public virtual string GetStr() 
    { 
     return "GClass"; 
    } 
} 

Répondre

-1

Je recommande de créer une interface pour vos objets d'entité au lieu de changer la classe de base. Le code généré ne doit pas être modifié.

Mise à jour: En raison de downvotes inexpliquées, j'ajoute le code ci-dessous, qui précise exactement ce que je veux dire:

// Generated by EF4 
public partial class EntityA : EntityObject 
{ 
    ... 
} 

// Interface defined in another file 
public interface IGClass<T> where T : IGClass<T> 
{ 
    string GetStr(); 
} 

// Automatically generated by T4 template 
public partial class EntityA : IGClass<EntityA> 
{ 
    public virtual string GetStr() 
    { 
     return "GClass"; 
    } 
} 

Le code résultant n'utilise CRGP, mais le fait via une interface à la place d'une classe de base. Les informations sur les modèles T4 sont: here.

+0

le code généré pourrait être modifié via un générateur de code. Je dois mettre les méthodes communes à la classe de base. –

+0

Je recommande toujours de créer une interface. Les implémentations peuvent être générées dans la classe partielle (dans un autre fichier). Y a-t-il une raison qui ne fonctionnerait pas? –

+0

Si l'interface d'utilisation, je vais devoir mettre en œuvre des choses à chaque classe, ce dont j'ai besoin est une classe de base pour gérer le processus commun. –

Questions connexes