我正在为我的测试构建一个模拟dbcontext。但是我需要从Entity Framework重新实现set函数。
这是我现在的代码:
public DbSet<TEntity> Set<TEntity>()
where TEntity : class, IObjectState
{
foreach (PropertyInfo property in GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic))
{
if (property.PropertyType == typeof(FakeDbSet<TEntity>))
return property.GetValue(this, null) as FakeDbSet<TEntity>;
}
throw new Exception("Type collection not found");
}
我的问题是我想在超类数据集中保存2个子类。 所以我将数据集设置如下:
private DbSet<BaseContact> Contacts { get; set; }
但是当我尝试再次使用类型Contact访问它时,我会得到一个异常,因为我没有先得到超类。我该怎么办?
答案 0 :(得分:0)
我不同意你是如何做到这一点的,但是对你当前问题的一个解决方案是测试这些属性是否属于&#39;如果没有找到结果,则基类型为TEntity
的泛型类型arg:
public DbSet<TEntity> Set<TEntity>()
where TEntity : class, IObjectState
{
var propertyInfos = GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (PropertyInfo property in propertyInfos )
{
if (property.PropertyType == typeof(FakeDbSet<TEntity>))
return property.GetValue(this, null) as FakeDbSet<TEntity>;
}
// no joy, test for base class(es)
var baseType = typeof( TEntity ).BaseType;
while( typeof( object ) != baseType )
{
foreach( var property in propertyInfos )
{
if( property.PropertyType ==
typeof( FakeDbSet<> ).MakeGenericType( baseType )
{
var baseTypeDbSet = property.GetValue(this, null);
var entityDbSet = // you will need to convert FakeDbSet<TBaseType> to FakeDbSet<TEntity>
return entityDbSet;
}
}
baseType = baseType.BaseType;
}
throw new Exception("Type collection not found");
}