2015-06-18 13 views
5

Ho un'applicazione a più livelli con molti livelli in diversi assembly. utilizzo il framework Entity 6.1 e voglio aggiungere la proprietà ObjectState all'entità di base per tracciare gli stati di entità. Il problema è BaseEntity si trova nella mia DLL di oggetti di dominio che è indipendente dal database e voglio aggiungere ObjectState nel progetto Entity Framework in quanto questa proprietà è legata al framework di entità. Come ottenere questo comportamento?C# Come estendere la classe che esiste in una dll differente aggiungendo una proprietà ad essa?

public enum ObjectState 
{ 
    Unchanged, 
    Added, 
    Modified, 
    Deleted 
} 
public interface IObjectState 
{ 
    [NotMapped] 
    ObjectState ObjectState { get; set; } 
} 
+0

Se la classe è pubblica e non sigillata, qual è il problema con l'ereditarietà? Penso che mi manchi qualcosa qui. –

+0

Il problema è l'attributo 'NotMapped'? Potresti usare la fluente configurazione di EF per assicurare che la proprietà non sia mappata? –

+0

Salve, non voglio aggiungere la proprietà ObjectState alla mia Base Entity in quanto questa è la base del mio dominio e questa proprietà è specifica per Entity Framework – yo2011

risposta

0

Se vuoi dire, che non si può implementare IObjectState in BaseEntity, perché deve essere indipendente da EF specifico, allora si dovrebbe avere due gruppi di soggetti - uno per il dominio, uno per EF, e utilizzare la mappatura (eventualmente, Automapper) tra questi insiemi:

// domain entities assembly 
public abstract class BaseEntity { } 

// EF entities assembly 
public abstract class BaseEFEntity : IObjectState 

// somewhere in the code 
Mapper.Map(domainEntity, efEntity); 

In realtà, quando si usa architettura a livelli, questo è un modo preferibile, quando ciascuno strato gestisce i modelli specifici.

+0

Grazie per il tuo aiuto ma questo aggiungerà un altro layer come ho già Dto layer e quindi, aggiungerà complessità all'applicazione – yo2011

2

È possibile utilizzare partial classes, se è possibile modificare il codice dei propri progetti di oggetti di dominio e dichiarare l'entità di base come classe parziale.

namespace DomainNameSpace 
{ 
    public partial class BaseEntity 
    { 
     // Your properties and method 
    } 
} 

Poi nel progetto Entity Framework è possibile aggiungere il seguente codice:

namespace DomainNameSpace 
{ 
    public partial class BaseEntity 
    { 
     public enum ObjectState 
     { 
      Unchanged, 
      Added, 
      Modified, 
      Deleted 
     } 
     public interface IObjectState 
     { 
      [NotMapped] 
      ObjectState ObjectState { get; set; } 
     } 
    } 
} 

Oppure, se non è possibile modificare i file in progetti di dominio o non piace questo approccio, forse ereditarietà può Aiuto. Nel tuo progetto Entity Framework crea una classe come la seguente.

namespace YourProjectNameSpace 
{ 
    public class StatefulEntityClassName : BaseEntity 
    { 
     public enum ObjectState 
     { 
      Unchanged, 
      Added, 
      Modified, 
      Deleted 
     } 
     public interface IObjectState 
     { 
      [NotMapped] 
      ObjectState ObjectState { get; set; } 
     } 
    } 
} 

Spero che questo aiuto.

+0

Grazie, ma le classi parziali devono essere nello stesso progetto (dll) – yo2011

Problemi correlati