使用实体框架

时间:2015-05-04 12:21:39

标签: c# entity-framework

我有不同实体的属性名称,如汽车,人等。根据Id我想得到名称。但我想在一个方法中完成它,它接受entityName并给出输出取决于那个。   像这样:

public string GetEntityByName(int id,string entityName)
    {
        using (var context = new MyContext())
        {
            return context[entityName].Find(id).Name;
        }
    }

2 个答案:

答案 0 :(得分:2)

您的所有实体都应扩展基类或实现定义Name属性的接口。

public interface INamed {
     string Name { get; set; }
}

public class Car : INamed {
     public int Id { get; set; }
     public string Name { get; set; }
}

我不知道DbContext是否支持索引属性,但如果确实如此,您可能会设法执行以下操作:

INamed namedEntity = context[entityName].Find(id) as INamed;
if(namedEntity != null)
     return namedEntity.Name;
else
     return string.Empty;

如果您确定所有实体都是INamed,那么您可以在一行中实现所有实体:

return ((INamed)context[entityName].Find(id)).Name;

请注意,如果检索到的实体未实施INamed

,后一种方法将会上升或抛出异常

答案 1 :(得分:2)

如何使用泛型方法来指示实体不是按名称而是按类型?您可以将结果存储为动态变量,以便您可以访问其中的任何属性。

public string GetEntityByName<TEntity>(int id)
{
    using (var context = new MyContext())
    {
        dynamic entity = context.Set<TEntity>.Find(id);
        try
        {
            return entity.Name;
        }
        catch(Exception e)
        {
            // Handle the situation when requested entity does not have Name property
        }
    }
}

或者,您可以使用反射来访问Name属性:

public string GetEntityByName<TEntity>(int id)
{
    var nameProperty = typeof(TEntity).GetProperty("Name");
    if(nameProperty == null)
        return null;
    using (var context = new MyContext())
    {
        object entity = context.Set<TEntity>.Find(id);
        return nameProperty.GetValue(entity) as string;
    }
}

您可以使用上述方法:

 string name = GetEntityByName<Car>(id);

如果您坚持将实体类型作为字符串参数传递,您也可以实现它:

public string GetEntityByName(int id, string entityName)
{
    Type entityType = Type.GetType(entityName);
    var nameProperty = entityType.GetProperty("Name");
    if(nameProperty == null)
        return null;
    using (var context = new MyContext())
    {
        object entity = context.Set(entityType).Find(id);
        return nameProperty.GetValue(entity) as string;
    }
}

仅当GetEntityByName方法在同一个程序集中定义并且与实体类相同的名称空间时,上述方法才有效。否则,作为GetType方法的参数,您必须传递完整的类型名称。