通过 EF 上的相关表映射整个实体
Mapping whole entity via related tables on EF
我有一个包含拥挤实体模型的项目。大多数 table 都是相互关联的(一对多、多对多和多对一)。我需要获取所有 table 个相互关联的名称。
使用下面的代码,我可以获得 class 的所有属性,并通过 Split 方法消除类型以获得与 class 相关的其他 table。
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" 相关的所有 table。除了为所有 table 手动执行此操作之外,我如何才能到达所有相关的?
假设我创建了一个新的 Dictionary<string, List<string>>
并将键设置为 table 名称,并使用与 table 相关的 table 名称填充 List<string>
=] 被设置为键。这样一来,我就可以把他们都抱起来了。但是,我无法计划场景。
我做到了。在这里,它是如何完成的:
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;
}
}
}
我有一个包含拥挤实体模型的项目。大多数 table 都是相互关联的(一对多、多对多和多对一)。我需要获取所有 table 个相互关联的名称。
使用下面的代码,我可以获得 class 的所有属性,并通过 Split 方法消除类型以获得与 class 相关的其他 table。
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" 相关的所有 table。除了为所有 table 手动执行此操作之外,我如何才能到达所有相关的?
假设我创建了一个新的 Dictionary<string, List<string>>
并将键设置为 table 名称,并使用与 table 相关的 table 名称填充 List<string>
=] 被设置为键。这样一来,我就可以把他们都抱起来了。但是,我无法计划场景。
我做到了。在这里,它是如何完成的:
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;
}
}
}