如何验证所有集合是否在上下文中的所有实体中实例化

时间:2016-07-18 14:58:52

标签: c# reflection collections entity-framework-6

我有DbContext个多个DbSet<>属性。 其中一些DbSet<>具有Icollection<>个对象(导航属性)。

我想编写一个单元测试,检查所有ICollection<>属性是否在我的实体构造函数中实例化。

这是我到目前为止的地方:

// this.ctx is the instance of my DbContext
var allProps = this.ctx.GetType().GetProperties();
var allDbSets = allProps.Where(pi => pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>));
var allEntities = allDbSets.SelectMany(pi => pi.PropertyType.GetGenericArguments());

foreach (var entity in allEntities)
{
    // get collections of entity
    var genericProps = entity.GetProperties().Where(pi => pi.PropertyType.IsGenericType);
    var collections = genericProps.Where(pi => pi.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>));

    if(collections.Any())
    {
        foreach (var coll in collections)
        {
            // coll is the PropertyInfo of a ICollection<> object.
        }
    }
}

从那里我被阻止了。我不知道如何测试该集合是否已实例化。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我经常在发布问题后找到答案......

我只需要实例化实体并获取collection属性的值以检查它是否为空。

var allProps = this.ctx.GetType().GetProperties();
var allDbSets = allProps.Where(pi => pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>));
var allEntities = allDbSets.SelectMany(pi => pi.PropertyType.GetGenericArguments());

foreach (var entity in allEntities)
{
    // get collections of entity
    var genericProps = entity.GetProperties().Where(pi => pi.PropertyType.IsGenericType);
    var collections = genericProps.Where(pi => pi.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>));

    if(collections.Any())
    {
        var ent = Activator.CreateInstance(entity);

        foreach (var coll in collections)
        {
            // coll is the PropertyInfo of a ICollection<> object.
            var val = coll.GetValue(ent);
            Assert.IsNotNull(val);
        }
    }
}