2011-02-03 5 views
1

Hey, disons que je veux que tous mes disques soient marqués d'un tampon standard.EF CTP5 POCO, classe de base et comment implémenter l'héritage

inserted_by, inserted_at, updated_by, updated_at, deleted_by, deleted_at, timestamp 

1 - Si je devais mettre cela dans une base (peut-être abstraite) classe POCO, quelle serait la meilleure stratégie d'héritage à mettre en œuvre. (J'utilise GUID comme clés primaires.)

Je ne veux pas utiliser la classe de base pour autre chose. Dans mon contexte Db; J'aimerais utiliser les classes POCO fin qui correspondent à la table db. DbSet, semble que je dois utiliser DbSet difficile, puis utiliser OfType pour interroger :)

2 - Si l'héritage est hors contexte, que recommanderiez-vous, ComplexType, une interface peut-être?

Répondre

1

Je fais exactement cela dans EF4. Il existe une classe de base de référentiel générique:

public class GenericRepository<T> : IGenericRepository<T> where T : BaseEntity 

Tous les référentiels d'entités héritent de cette classe. La méthode .Add générique() et .Update() fixe automatiquement les données d'audit:

public void Add(T entity) 
{ 
     entity.CreatedOn = DateTime.UtcNow; 
     entity.CreatedBy = UserName; 
     entity.LastModifiedOn = entity.CreatedOn; 
     entity.LastModifiedBy = entity.CreatedBy; 
     ObjectContext.AddObject(GetEntitySetName<T>(), entity); 
} 

public void Update(T entity) 
{ 
     T originalEntity = ObjectSet.Single(t => t.Id == entity.Id);    
     entity.CreatedOn = originalEntity.CreatedOn; 
     entity.CreatedBy = originalEntity.CreatedBy; 
     entity.LastModifiedOn = DateTime.UtcNow; 
     entity.LastModifiedBy = UserName; 
     ObjectSet.ApplyCurrentValues(entity); 
} 

vous pouvez donc voir qu'il ne marche pas entrer dans la classe de base POCO BaseEntity, parce que ce n'est pas la responsabilité de Poco. Au lieu de cela, il appartient au référentiel.

+0

comment faites-vous cela (je ne pense pas que vous utilisez POCO) – hazimdikenli

+0

+1 je suis d'accord avec cela. mettre à jour un horodatage est une préoccupation de base de données, mettre cette logique dans le POCO le ferait cesser d'être un POCO. Avoir un horodatage n'est pas une raison réalisable pour implémenter l'héritage avec EF. – RPM1984

+0

@RPM: Je ne suis pas d'accord - si vous utilisez Timestamp, vous devez généralement le mapper dans votre entité et le définir comme ConcurrencyCheckAttribute (code d'abord) ou Mode de concurrence simultanée (EF4 pur). Si vous ne mappez pas l'horodatage dans l'entité, c'est comme si vous ne l'utilisiez pas du tout. –

0

Vous avez besoin de l'héritage TPC (Table par classe ou Table par type de béton). Vérifiez this article sur le mappage CTP5 de TPC.

+0

Si j'utilise TPC, en quoi consistent mes DbSet, puis-je les baser sur le type de béton ou sur le type de base? – hazimdikenli

+0

@hazimdikenli: Lors de l'utilisation de tout type d'héritage, l'ensemble est DbSet mais les entités de l'ensemble sont de types dérivés. Vous pouvez utiliser OfType pour interroger uniquement les types dérivés. –

+0

alors il ne va pas me fournir ce dont j'ai besoin. – hazimdikenli

Questions connexes