通过EF上的相关表映射整个实体

时间:2015-03-25 08:18:32

标签: c# entity-framework mapping foreign-key-relationship

我有一个拥挤的实体模型的项目。大多数表彼此相关(一对多,多对多,多对一)。我需要让所有表名相互关联。

使用下面的代码,我可以获取类的所有道具并通过Split方法消除类型以获取与该类相关的其他表。

List<string> tabloIsimleri = new List<string>();
public object GetTableList()
    {            
        var List = dbContext.Takips.ToList();

        foreach (var item in List)
        {
            foreach (_PropertyInfo p in typeof(Takips).GetProperties())
            {
                var propName = p.PropertyType.FullName;

                if (propName.Contains("ProjectName.DataService"))
                {
                    string[] test = p.Name.Split(' ');
                    int a = test.Count();
                    var son = test[a - 1];
                    if (!tabloIsimleri.Contains(son))
                    {
                        tabloIsimleri.Add(son);
                    }
                }                   
            }
        }

        return tabloIsimleri;
    }

此方法返回与“Takips”相关的所有表格。除了为所有表格手动执行此操作外,如何才能到达所有相关表格?

假设我创建了一个新的Dictionary<string, List<string>>并将密钥设置为表名,并使用与设置为密钥的表相关的表名填充List<string>。通过这种方式,我可以掌握所有这些。但是,我无法计划这种情况。

1 个答案:

答案 0 :(得分:0)

我已经成功了。在这里,它是如何完成的:

public class ReportService
{
    EntityName dbContext = new EntityName();

    List<string> tabloIsimleri = new List<string>();
    List<string> tabloListesi = new List<string>();
    List<string> iliskiliOlanlar = new List<string>();
    Dictionary<string, List<string>> agacGosterim = new Dictionary<string, List<string>>();


    public void Test()
    {
        try
        {
            tabloListesi = Tablolar();
            string tutmac;
            foreach (var t in tabloListesi)
            {
                tutmac = string.Format("ProjectName.DataService.{0}", t);
                var tip = Type.GetType(tutmac, true);

                foreach (_PropertyInfo p in tip.GetProperties())
                {
                    var propName = p.PropertyType.FullName;

                    if (propName.Contains("ProjectName.DataService"))
                    {
                        string[] test = p.Name.Split(' ');
                        int a = test.Count();
                        var son = test[a - 1];
                        if (!iliskiliOlanlar.Contains(son))
                        {
                            iliskiliOlanlar.Add(son);
                        }
                    }
                }
                agacGosterim.Add(t, iliskiliOlanlar);
                iliskiliOlanlar = new List<string>();
            }
        }
        catch (Exception)
        {
        }
    }
    public List<string> Tablolar()
    {
        using (var context = new EntityName())
        {
            var objectContext = ((IObjectContextAdapter)context).ObjectContext;
            var storageMetadata = ((EntityConnection)objectContext.Connection).GetMetadataWorkspace().GetItems(DataSpace.SSpace);
            var entityProps = (from s in storageMetadata where s.BuiltInTypeKind == BuiltInTypeKind.EntityType select s as EntityType);
            foreach (var item in entityProps)
            {
                string[] ayir = item.FullName.Split('.');
                int a = ayir.Count() - 1;
                if (!tabloIsimleri.Contains(ayir[a]))
                {
                    tabloIsimleri.Add(ayir[a]);
                }
            }
            return tabloIsimleri;
        }

    }

}