DbContext设置方法

时间:2014-10-13 13:14:58

标签: c# entity-framework

我正在为我的测试构建一个模拟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访问它时,我会得到一个异常,因为我没有先得到超类。我该怎么办?

1 个答案:

答案 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");
}