如何检测实体框架迁移是否破坏了我的SQL视图?

时间:2016-04-01 14:28:07

标签: sql-server entity-framework entity-framework-6 ef-migrations sql-view

我有很多表,SQL Views提供了一些查询。

我不想要的是创建维护噩梦,开发人员首先更改代码中的列,导致一个或多个SQL视图中断。

EF中是否有机制来检查这个?

2 个答案:

答案 0 :(得分:0)

视图是否映射到EF?
通常我会运行EF配置测试来检查所有表格 我也发布了主要代码,但它只有在主键包含一个且只有一个名为Id的属性时才有效。你可以修改它调用FirstOrDefault方法(你可以看看如何调用它How do I use reflection to call a generic method?)。

[TestMethod]
public void All()
{

    var properties = typeof (Context).GetProperties().Where(p => IsSubclassOfRawGeneric(typeof(DbSet<>), p.PropertyType));

    foreach (PropertyInfo property in properties)
    {
        Type entityType = property.PropertyType.GetGenericArguments()[0];
        PropertyInfo idProperty = entityType.GetProperty("Id");
        if (idProperty == null)
        {
            Console.WriteLine("Id property not found. Cannot check type configuration");
            continue;
        }
        Type idPropertyType = idProperty.PropertyType;
        DbSet dbSet = _context.Set(entityType);
        if (idPropertyType == typeof(string))
        {
            try
            {
                dbSet.Find("A");
            }
            catch (Exception e)
            {
                throw new Exception("Cannot access to DbSet " + property.Name, e);
            }
        }
        else if (idPropertyType == typeof (int))
        {
            try
            {
                dbSet.Find(1);
            }
            catch (Exception e)
            {
                throw new Exception("Cannot access to DbSet " + property.Name, e);
            }
        }
        else
        {
            Console.WriteLine("Id property type not supported ('{0}'). Cannot check type configuration", idPropertyType.Name);
            continue;
        }

    }

}


static bool IsSubclassOfRawGeneric(Type generic, Type toCheck)
{
    while (toCheck != null && toCheck != typeof(object))
    {
        var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck;
        if (generic == cur)
        {
            return true;
        }
        toCheck = toCheck.BaseType;
    }
    return false;
}

答案 1 :(得分:0)

不,没有。在一长串争论中,为什么代码首次迁移是玩具,而不是工具。

将其与在SSDT环境中维护数据库并手动生成AND VALIDATING更改脚本进行比较。迁移转变为加载SQL脚本并执行它们&#34;使用任何非基线功能的那一刻(这些功能很有用)会更快。

所以,没有。

您可以做的是使用单元/集成测试自动测试应用程序在上次迁移时的工作情况。自动化救援测试。