Linq2Sql测试

时间:2008-12-30 21:08:26

标签: c# .net unit-testing linq-to-sql

我有测试数据库和生产数据库。当开发我当然是针对该测试数据库工作时,那么在部署时我必须半手动更新生产数据库(通过运行batch-sql-script)。这通常可以正常工作,但是如果部署的数据库与测试数据库不同,则可能会出错。

对于表:有没有什么方法可以自动测试我使用linq2sql映射到生产数据库的所有实体,以便所有属性等都存在?

4 个答案:

答案 0 :(得分:5)

我在开发过程中使用了类似的方法,如果您一次修改过多的表,我可以确保开发和生产数据库之间的同步很容易成为一项艰巨的任务。

我意识到最好的方法是忘记手动进行这种同步,它太耗时而且容易出错,并且开始使用工具来自动化该过程。

我一直在使用RedGate SQlCompare,我可以说我不能没有它了。它比较数据库的所有结构,指出修改并完美地应用更改,即使在具有数百万条记录的表中也是如此。

Link to Redgate SQL Compare

答案 1 :(得分:2)

据我所知,在提交之前无法自动测试。然而,您可以推断它并以编程方式检查它。我有一个控制器用于我用来编组Linq对象的每个Linq对象,并且该控制器有一个IsValid方法,它使用我在这里看到的技术检查数据库规则: http://www.codeproject.com/KB/cs/LinqColumnAttributeTricks.aspx

我用以下代码调用它:

        if (address.City.Length > Utilities.LinqValidate.GetLengthLimit(address, "City"))
            throw new ArgumentOutOfRangeException("address.City Max Length Exceeded");

以下是我正在使用的实用程序的修改版本:

    public static int GetLengthLimit(object obj, string field)
    {
        int dblenint = 0;   // default value = we can't determine the length

        Type type = obj.GetType();
        PropertyInfo prop = type.GetProperty(field);
        // Find the Linq 'Column' attribute
        // e.g. [Column(Storage="_FileName", DbType="NChar(256) NOT NULL", CanBeNull=false)]
        object[] info = prop.GetCustomAttributes(typeof(ColumnAttribute), true);
        // Assume there is just one
        if (info.Length == 1)
        {
            ColumnAttribute ca = (ColumnAttribute)info[0];
            string dbtype = ca.DbType;

            if (dbtype.StartsWith("NChar") || dbtype.StartsWith("NVarChar") ||
                dbtype.StartsWith("Char") || dbtype.StartsWith("VarChar")
                )
            {
                int index1 = dbtype.IndexOf("(");
                int index2 = dbtype.IndexOf(")");
                string dblen = dbtype.Substring(index1 + 1, index2 - index1 - 1);
                int.TryParse(dblen, out dblenint);
            }
        }
        return dblenint;
    }

    public static bool CanBeNull(object obj, string field)
    {
        bool canBeNull = false;

        Type type = obj.GetType();
        PropertyInfo prop = type.GetProperty(field); 
        object[] info = prop.GetCustomAttributes(typeof(ColumnAttribute), true); 
        if (info.Length == 1)
        {
            ColumnAttribute ca = (ColumnAttribute)info[0];
             canBeNull = ca.CanBeNull; 
        }
        return canBeNull;
    }

答案 2 :(得分:0)

查看sysobjects和syscolumns(以及sysindexes)。由于这些表没有变化,您可以编写一些LINQ来加载它们并验证您的期望是否得到满足。或者您可以在SQL脚本中执行此操作。

答案 3 :(得分:0)

我想添加我的选择,Adept SQLDiff,它可能不像Redgate那样光滑,但我发现它更可靠(我评估了两者,尽管我应该说这是几年前)。 我有多年的免费更新(支持SQL Server 7 - 2008)。 使用Data Diff选项获得320美元的价格非常好(Redgate相当便宜)。 开发人员亲自快速地回复电子邮件。 不,我不为他们工作,只是一个快乐的用户:)