背景
我正在使用EF而且我有很多桌子。当我插入一个具有导航属性的内容但没有id的新实体(我正在从xls文件中读取内容)时,我不想显式加载所有导航属性。这是太多的代码。所以我尝试了一种通用方式:
private void loadExistingNavigationProperties<TEntity>(TEntity entityToInsert) where TEntity : class
{
Type type = typeof(TEntity);
var properties = type.GetProperties().Except(type.GetProperties().Where(x => x.Name.Contains("id")));
foreach (PropertyInfo property in properties)
{
if (property.PropertyType.FullName.Contains("MyNamespace"))
{
property.SetValue(entityToInsert, findNavigationProperty<???>(property.GetValue(entityToInsert)));
}
}
}
我有entityToInsert
。如果它具有导航属性(contains("MyNamespace")
),我会检查它的所有属性。如果是这样,则应加载导航属性(见下文)并设置。
private object findNavigationProperty<TNavigationProperty>(TNavigationProperty navigationPropertyValue) where TNavigationProperty : class
{
List<TNavigationProperty> navigationProperties = GetAllEntries<TNavigationProperty>();
foreach (var entity in navigationProperties)
{
if (propertiesAreEqual(entity, navigationPropertyValue))
{
return entity;
}
}
return navigationPropertyValue;
}
传递导航属性属性的当前值。它包含所有信息,如名称或其他内容,但不包含id。首先,我将获得具有该类型的所有可用导航属性。然后我在搜索是否有一个属性与当前属性具有相同的属性。然后返回此项并将其设置为导航属性。
编辑:
public List<TEntity> GetAllEntries<TEntity>() where TEntity : class
{
using (var dbContext = new InventarDBEntities(MainWindow.connectionName))
{
return GetAllEntries<TEntity>(dbContext);
}
}
public List<TEntity> GetAllEntries<TEntity>(InventarDBEntities dbContext) where TEntity : class
{
return dbContext.Set<TEntity>().ToList();
}
问题
我现在的问题是如何告诉方法findNavigationProperty
泛型类型是属性值的类型。所以用类型替换???
。
答案 0 :(得分:0)
您可以检索如下通用类型:
var item = propertyInfo.GetGenericArguments()[0];
您可以使用&#34; is&#34;
来检查它是否属于类型你也可以这样做:
item.BaseType == typeof(Whatever type your navigation props inherit);