2009-07-03 6 views

Antwort

3

Wenn Sie die EntitySet oder die EntityType, für das Unternehmen, dann können Sie verwenden, um die KeyMembers Eigenschaft erhalten können:

public IEnumerable<string> GetIdProperties(EntitySetBase entitySet) 
{ 
    return GetIdProperties(entitySet.ElementType); 
} 

public IEnumerable<string> GetIdProperties(EntityTypeBase entityType) 
{ 
    return from keyMember in entityType.KeyMembers 
     select keyMember.Name 
} 

Sie erhalten ein generisches Objekt aus dem Kontext gesetzt:

public ObjectSet<TEntity> GetEntitySet<TEntity>(ObjectContext context) 
{ 
    return context.CreateObjectSet<TEntity>(); 
} 
0

Entity-Klasse ist immer noch eine Klasse, die von System.Data.Objects.DataClasses.EntityObject erbt, also denke ich, Reflexion wird noch daran arbeiten.

Haben Sie es versucht? Haben Sie einen Fehler?

1

Diese post im Entity Framework-Support-Foren zeigt, wie Reflektion ID-Felder und ihre Details zu finden.

5
public static IEnumerable<string> GetIdFields<TEntity>() where TEntity 
    : EntityObject 
{ 
    var ids = from p in typeof(TEntity).GetProperties() 
       where (from a in p.GetCustomAttributes(false) 
        where a is EdmScalarPropertyAttribute && 
         ((EdmScalarPropertyAttribute)a).EntityKeyProperty 
        select true).FirstOrDefault() 
       select p.Name; 
    return ids; 
} 

public static string GetIdField<TEntity>() where TEntity : EntityObject 
{ 
    IEnumerable<string> ids = GetIdFields<TEntity>(); 
    string id = ids.Where(s => s.Trim().StartsWith(typeof(TEntity).Name. 
        Trim())).FirstOrDefault(); 
    if (string.IsNullOrEmpty(id)) id = ids.First(); 
    return id; 
} 

Sie könnten beide Funktionen zu einem zusammenführen oder Ihre Suchbedingungen festlegen.