如何在EF4中获取实体的第一个EntityKey名称

时间:2010-07-27 08:05:14

标签: entity-framework repository entity entity-framework-4 entitykey

如何获取Entity Framework 4实体的第一个EntityKey名称,因为我正在建立一个存储库系统,我想通过Id获取一个项目(这是EF的主键,是实体的第一个实体键) )

我正在使用此代码

public virtual TEntity GetById(string keyName, Guid entityId)
        {
            var entityKey = new EntityKey(this.QualifiedEntitySetName, keyName, entityId);
            object entity;
            return this.Context.TryGetObjectByKey(entityKey, out entity) ? entity as TEntity : null;
        }

我想让实体键名称动态化。 任何人都可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:5)

var keyName = this.Context         .MetadataWorkspace         .GetEntityContainer(this.Context.DefaultContainerName,DataSpace.CSpace)         .BaseEntitySets         .First(meta => meta.ElementType.Name == this.entityName)         .ElementType         .KeyMembers         。选择(k => k.Name)         .FirstOrDefault();

我知道它看起来太多但你想通过拥有实体名称来获得它。

答案 1 :(得分:2)

您可以使用以下代码从MetaDataWorkspace获取Entity Key成员集合:

ReadOnlyCollection keyMembers = db.MetadataWorkspace.GetType("", "Entity_Namespace", System.Data.Metadata.Edm.DataSpace.CSpace).MetadataProperties["KeyMembers"].Value as ReadOnlyCollection;

答案 2 :(得分:2)

试试这个:

/// <summary>
/// Gets the entity key for the POCO Entity type.
/// </summary>
/// <param name="entity">The entity.</param>
/// <returns></returns>
private EntityKey GetEntityKey(TEntity entity)
{
    ReadOnlyMetadataCollection<EdmMember> keyMembers =
        this.ObjectSet.EntitySet.ElementType.KeyMembers;

    var entityKeyMembers = new List<EntityKeyMember>();

    //Construct the entity key for the POCO Entity type object.
    foreach (EdmMember keyMember in keyMembers)
    {
        object keyMemberValue = entity.GetType().GetProperty(keyMember.Name).GetValue(entity, null);
        entityKeyMembers.Add(new EntityKeyMember(keyMember.Name, keyMemberValue));
    }

    //Create the Entity key for our POCO Entity type object.
    return new EntityKey(this.ObjectSource.DefaultContainerName
        + "." + this.ObjectSet.EntitySet.Name, entityKeyMembers);
}

objectsource是objectcontext。

答案 3 :(得分:0)

public static string GetPrimaryKeyName(this object entity)
   {
       var prop = entity.GetType().GetProperties().Where(x =>x.GetCustomAttributes(false).Where(y => y is ColumnAttribute&&((ColumnAttribute)y).IsPrimaryKey == true).Any()).FirstOrDefault();
          if (prop != null)
              return prop.Name;
          return string.Empty;

   }