7

Sto utilizzando Entity Framework 5 nell'approccio Database First e sto utilizzando il file edmx.Classe base/Entity in EntityFramework 5.0

La maggior parte delle mie entità ha 6 campi comuni. Campi come CreatedAt, CreatedBy ecc. Ora, ho implementato alcune funzioni come estensioni che possono essere applicate solo a IQueryable di quelle Entità che hanno i campi comuni. Ma quando implemento il metodo di estensione, è possibile accedervi da qualsiasi tipo di IQueryable dato che è stato scritto T e io posso solo definire che il tipo T dovrebbe sempre essere di un tipo.

Così, ho pensato di poter dare una classe base alle entità che hanno campi comuni e definire il tipo T come quel tipo di base. Ma, sembra che non posso farlo.

Qualche idea su come risolvere questo o implementare ciò che ho spiegato sopra?

risposta

8

Non creare una classe base. Crea un interfaccia, come di seguito:

public interface IMyEntity 
{ 
    DateTime CreatedAt { get; set; } 
    string CreatedBy { get; set; } 
    // Other properties shared by your entities... 
} 

Quindi, i tuoi modelli saranno in questo modo:

[MetadataType(typeof(MyModelMetadata))] 
public partial class MyModel : IMyEntity 
{ 
    [Bind()] 
    public class MyModelMetadata 
    { 
     [Required] 
     public object MyProperty { get; set; } 

     [Required] 
     public string CreatedBy { get; set; } 
    } 
} 
+0

Grazie per la risposta rapida. Quindi, se definisco l'interfaccia al di fuori del file edmx. allora dove dirò all'entità di implementare da quell'interfaccia. Non è facile modificare manualmente tutte le entità richieste in quanto dovrò fare di nuovo tutto quando aggiorno il file edmx. – Amila

+2

Non si tocca il codice generato automaticamente. Questo è ciò per cui si suppone che le classi parziali siano utilizzate. Si crea una classe parziale (nella cartella Modelli) per ciascuna delle entità in EF. È qui che puoi definire un MetadataType per i tuoi modelli (per l'annotazione dei dati). Vedi la risposta aggiornata. – ataravati

+0

Sì, sto usando MetadataType al momento. Ma pensavo che ci potesse essere un modo semplice per farlo, ad esempio dare una classe base a un'entità, sarebbe stato meglio se avesse dato un'interfaccia anche all'interno del diagramma. Ad ogni modo, è come se dovessi definire la classe parziale per tutte le entità. Grazie per l'aiuto rapido – Amila

2

io sono un fan di:

public interface IShared 
{ 
    DateTime CreatedOn { get; set; } 
} 

public interface ISharedValidation 
{ 
    [Required] 
    DateTime CreatedOn { get; set; } 
} 


public interface IMyEntity: IShared 
{ 
    // Entity Specifics 
    string Username { get; set; } 
} 

public interface IMyEntityValidation: ISharedValidation 
{ 
    [Required] 
    string Username { get; set; } 
} 

Quindi, i tuoi modelli saranno così:

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
    public object CreatedOn { get; set; } 
    public string Username { get; set; } 
} 

Se T4 genera Ted da Entity Framework allora il vostro non generato automaticamente classe sarà simile:

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
} 

Tipicamente, it is not recommended to use Bind in Asp.Net MVC.