Entity Framework: come ottengo le colonne?

Desidero ottenere un elenco di nomi di colonne, tipi e se la colonna è un PK di un object tabella in Entity Framework.

Come faccio questo in C # (4.0) (idealmente genericamente)?

La risposta vincente sarà quella che lo farà in modo efficiente e soprattutto genericamente.

Capito – Ho usato una query di riflessione basata su linq:

IEnumerable properties = from p in typeof(T).GetProperties() where (from a in p.GetCustomAttributes(false) where a is EdmScalarPropertyAttribute select true).FirstOrDefault() 

Smistato! Grazie per tutti i suggerimenti.

Cordiali saluti – Sto creando una clausola dynamic where usando LINQ, espressioni lambda dinamiche per build ad esempio la ricerca che cercherà automaticamente in tutte le colonne per impostazione predefinita. Ma avevo anche bisogno che i nomi delle colonne fossero verificati, perché permetterò che questo venga sovrascritto e queste chiamate saranno fatte tramite javascript ajax, il cui input non può essere considerato attendibile, quindi necessario per verificare i nomi delle colonne.

Ho usato quanto sopra per posizionare i risultati in un object personalizzato con proprietà denominate FieldName, FieldType, PrimaryKey. Ta daaa.

Personalizzalo ulteriormente con

 IEnumerable properties = from p in typeof(T).GetProperties() where (from a in p.GetCustomAttributes(false) where a is EdmScalarPropertyAttribute select true).FirstOrDefault() select new FieldList { FieldName = p.Name, FieldType = p.PropertyType, FieldPK = p.GetCustomAttributes(false).Where(a => a is EdmScalarPropertyAttribute && ((EdmScalarPropertyAttribute)a).EntityKeyProperty).Count() > 0 }; 

se vuoi solo nomi di colonne, allora ho la migliore risposta:
var properties = (from t in typeof(YourTableName).GetProperties() select t.Name).ToList(); var name= properties[0];

Se non si desidera utilizzare il riflesso, vedere la risposta qui . Sostituisci il nome dell’entity framework sotto con il nome dell’ quadro

 var cols = from meta in ctx.MetadataWorkspace.GetItems(DataSpace.CSpace) .Where(m=> m.BuiltInTypeKind==BuiltInTypeKind.EntityType) from p in (meta as EntityType).Properties .Where(p => p.DeclaringType.Name == "EntityName") select new { PropertyName = p.Name, TypeUsageName = p.TypeUsage.EdmType.Name, //type name Documentation = p.Documentation != null ? p.Documentation.LongDescription : null //if primary key }; 

Se qualcuno sta ancora guardando, ecco come l’ho fatto. Questo è un metodo di estensione per DBContext che accetta un tipo e restituisce i nomi delle colonne fisiche e le loro proprietà.

Questo utilizza il contesto dell’object per ottenere l’elenco delle colonne fisiche, quindi utilizza la proprietà dei metadati “PreferredName” per mappare ogni colonna come sua proprietà.

Poiché utilizza il contesto dell’object, avvia una connessione al database, pertanto la prima esecuzione sarà lenta a seconda della complessità del contesto.

 public static IDictionary GetTableColumns(this DbContext ctx, Type entityType) { ObjectContext octx = (ctx as IObjectContextAdapter).ObjectContext; EntityType storageEntityType = octx.MetadataWorkspace.GetItems(DataSpace.SSpace) .Where(x => x.BuiltInTypeKind == BuiltInTypeKind.EntityType).OfType() .Single(x => x.Name == entityType.Name); var columnNames = storageEntityType.Properties.ToDictionary(x => x.Name, y => y.MetadataProperties.FirstOrDefault(x => x.Name == "PreferredName")?.Value as string ?? y.Name); return storageEntityType.Properties.Select((elm, index) => new {elm.Name, Property = entityType.GetProperty(columnNames[elm.Name])}) .ToDictionary(x => x.Name, x => x.Property); } 

Per usarlo, basta creare una class statica di supporto e aggiungere la funzione precedente; allora è semplice come chiamare

 var tabCols = context.GetTableColumns(typeof(EntityType)); 

Non ho un campione di codice per te, ma solo per essere indirizzato nella giusta direzione, potresti voler usare Sql Management Objects (SMO); è ansible utilizzarlo per ottenere una gerarchia di oggetti per un’istanza di Sql Server, che è quindi ansible enumerare e selezionare le informazioni necessarie.

Dai un’occhiata a questo set di tutorial per iniziare con la programmazione: http://www.codeproject.com/KB/database/SMO_Tutorial_1.aspx http://www.codeproject.com/KB/database/SMO_Tutorial_2.aspx

Se stai utilizzando DB First o Model First, apri il file .edmx EF generato in un editor di testo. È solo un file XML e contiene tutto ciò di cui hai bisogno. Ecco un esempio di un mio modello. Nota che sto usando il driver EF di Oracle, quindi il tuo non sarà identico (ma dovrebbe essere abbastanza vicino).

         
           
             
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
         

È ansible utilizzare un parser XML per analizzare il file e ottenere quello che ti serve. Il file .edmx contiene dati sia sulle entity framework che sulle tabelle SQL, quindi è necessario assicurarsi di averne la parte giusta per ottenere ciò che si desidera.

 typeof(TableName).GetProperties().Select(x => x.Name).ToList();