繁体   English   中英

首先获取实体框架模型动态的实体名称

[英]Get Entity Framework Model first Entity Name dynamic

我想做这样的事情:在Entity Framework获取Entity列名。

我不想直接使用Entity Name ,我想将Entity-Name作为字符串传递给方法。

 public HttpResponseMessage GetColumnName(string MyClassName)
{

    var db = new DAL.MyEntities();
    var names = typeof(db.MyClassName).GetProperties()
    .Select(property => property.Name)
    .ToArray();

    return new HttpRequestMessage().CreateResponse(HttpStatusCode.OK, names, new HttpConfiguration().Formatters.JsonFormatter);

}

注意:我不想使用switch-caseIf-else

为什么我需要这个? 我必须将API中的数据作为JSON返回。 我们创建了一个将实体模型转换为类的方法,而没有任何关系:

实体类别:

public partial class foo
{
    public foo()
    {
        this.parent = new HashSet<parent>();
        this.child = new HashSet<child>();
    }

    public int id { get; set; }
    public string title { get; set; }

    public virtual ICollection<parent> parent { get; set; }
    public virtual ICollection<child> child { get; set; }

}

我想调用此API:

public HttpResponseMessage GetFooData()
{
    var db = new DAL.MyEntities();
    var data = db.foos.ToList();
    return new HttpRequestMessage().CreateResponse(HttpStatusCode.OK, data, new HttpConfiguration().Formatters.JsonFormatter);
}

如果我返回一个List<foo> data则会出现此错误:

The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.

为了解决这个问题,我必须创建一个与实体模型相同的模型,而没有任何子代和父代,如下所示:

public partial class Myfoo
{
    public int id { get; set; }
    public string title { get; set; }

}

然后,我将循环遍历List<foo>并填充List<Myfoo> ,然后返回List<Myfoo>

现在创建此类,每天都在浪费我的时间,我想创建一个Generator来创建MyFoo和Generator以用List<Foo>填充Lis<MyFoo> List<Foo>

如果您有标准定义的DbContext

public class MyEntities : DbContext
{
    //..
    public DbSet<MyEntity> MyEntites { get; set; }

    //..
}

你需要使用反射

var db = new DAL.MyEntities();
var type = db.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
                       .Where(pr => pr.PropertyType.IsGenericType)
                       .Where(pr => pr.PropertyType.GetGenericTypeDefinition() ==  
                                           typeof(DbSet<>))
                       .Select(pr => pr.PropertyType.GetGenericArguments().Single())
                       .SingleOrDefault(t => t.Name == MyClassName);
if (type == null) / * type not found case */ ;

var names = type.GetProperties(BindingFlags.Instance | BindingFlags.Public)
                .Select(property => property.Name)
                .ToArray();

我的问题已解决,如下所示:

public List<string> GetServiceModelProprty(string EntityName, bool ShowGeneric = false)
    {

        List<string> ProNames = new List<string>();
        var names = Type.GetType(EntityName)
            .GetProperties()
            .Select(p => p.Name).ToArray();
        ProNames.AddRange(names);
        return ProNames;
    }

我从Entity获得所有属性,请注意EntityName应该包含NameSpace,如: DAL.MyClassName

这也是我的映射器Generator:

public class MapperGenerator
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="FullEntityName">Entity Name in  DataBase Contain NameSpace</param>
    /// <param name="ServiceModelName"></param>
    /// <param name="MapperFunctionName"></param>
    /// <param name="NeedHtmlBreak"></param>
    /// <returns></returns>
    public string GenerateMapperString(string FullEntityName, string ServiceModelName, string MapperFunctionName, bool NeedHtmlBreak)
    {

        List<string> PropNames = new List<string>();
        var names = new ECBVendorDAL.DataMapperGenerator().GetServiceModelProprty(FullEntityName);
        PropNames.AddRange(names);
        // DB Entity
        string EntityName = FullEntityName.Split('.')[1];
        //Service Model
        string B_SM = ServiceModelName;
        // Function In Mapper
        string strFunc = MapperFunctionName;

        StringBuilder sb = new StringBuilder();
        // A>B
        sb.Append(GetModelString(PropNames, EntityName, ServiceModelName, strFunc, NeedHtmlBreak, false));
        // B>A
        sb.Append(GetModelString(PropNames, ServiceModelName, EntityName, strFunc, NeedHtmlBreak, false));
        //List<A> to List<B>
        sb.Append(GetModelString(PropNames, EntityName, ServiceModelName, strFunc, NeedHtmlBreak, true));
        //List<B> to List<A>
        sb.Append(GetModelString(PropNames, ServiceModelName, EntityName, strFunc, NeedHtmlBreak, true));

        return sb.ToString();
    }

    private string GetModelString(List<string> ColunNames, string ReturnedClass, string PassedClass, string strFunctionName, bool ApplyHtmlBr, bool IsList = false)
    {
        string htmlBr = ApplyHtmlBr ? "<br />" : string.Empty;
        StringBuilder Sb = new StringBuilder();
        if (IsList)
        {
            #region dbModelName To dbServiceModelName
            //public static List<VendorServiceModel> GetVendorServiceModel(ICollection<ECB_Vendor> input)
            Sb.Append("<xmp>");
            Sb.Append(string.Format("public static List<{0}> {2}(ICollection<{1}> input)", ReturnedClass, PassedClass, strFunctionName));
            Sb.Append("</xmp>" + htmlBr);
            Sb.Append("{" + htmlBr);
            // -    -   -   -   - List<VendorServiceModel> result = new List<VendorServiceModel>();
            Sb.Append("<xmp>");
            Sb.Append(string.Format(" List<{0}> result = new List<{0}>();", ReturnedClass));
            Sb.Append("</xmp>" + htmlBr);
            Sb.Append("foreach (var item in input)" + htmlBr);
            Sb.Append("{" + htmlBr);
            Sb.Append("<xmp>");
            Sb.Append(string.Format("result.Add({0}(item));", strFunctionName));
            Sb.Append("</xmp>" + htmlBr);
            Sb.Append("}" + htmlBr);
            Sb.Append("return result;" + htmlBr);
            Sb.Append("}" + htmlBr);
            #endregion
        }
        else
        {
            #region One - PassedClass To ReturnedClass

            Sb.Append(htmlBr);
            Sb.Append(string.Format("public static {0} {2}({1} input)" + htmlBr, ReturnedClass, PassedClass, strFunctionName));
            Sb.Append("{" + htmlBr);
            Sb.Append(string.Format("return new {0}()", ReturnedClass));
            Sb.Append("{" + htmlBr);
            foreach (var item in ColunNames)
            {
                Sb.Append(string.Format("{0} = input.{0} , " + htmlBr, item));
            }
            Sb.Append("};" + htmlBr);
            Sb.Append("}" + htmlBr);
            Sb.Append(htmlBr);

            #endregion

        }

        return Sb.ToString();

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM