【问题标题】:How do I write a test to verify Entity Framework Database First Model如何编写测试来验证实体框架数据库优先模型
【发布时间】:2013-11-07 21:38:52
【问题描述】:

我有一个实体框架数据库优先模型。

我想编写一个 MSTest/nUnit 测试来验证在我的 edmx 模型中定义的所有存储过程和表在数据库上仍然有效。

有一个庞大的开发团队,其中一些人只处理存储过程,而另一些人则在 c# 中工作,我想运行一个集成测试来验证/验证项目中的 EF 模型。

我在 Linq2Sql 中进行了测试,以查找存储过程调用中常见的属性,然后运行 ​​SQL 查询以验证存储过程是否仍然存在。 我现在已升级到 EF6,我想在构建中保持类似的健全性检查。

这是我目前所拥有的。

 var list = context.MetadataWorkspace.GetItems<EntityType>(DataSpace.CSpace);

 var badSp = new List<string>();

 foreach (var table in list)
 {
     if (!DoesTableExist(dbContext, table))
     {
       badSp.Add(table.Name);
     }
 }

 if (badSp.Any())
 {
            var retval = new StringBuilder();
            retval.AppendLine("The Following Objects do not exist in the database but do not exist the " + dbContext.GetType().Name + ".edmx, they may be obsolete");
            badSp.Sort();
    foreach (var sp in badSp)
    {
       retval.AppendLine(sp);
    }
    Assert.Fail(retval.ToString())  
}

我提出的一些问题是这并不能告诉我表是否在不同的架构中。架构返回 null。我有多个架构中的表。

我也想做一个类似的测试来验证表和视图,它们也在不同的模式中。

【问题讨论】:

  • 如何读取实体框架模型并针对给定的连接进行验证?

标签: c# sql-server entity-framework nunit mstest


【解决方案1】:

我找到了答案:

var list = context.MetadataWorkspace.GetItems<EdmFunction>(DataSpace.SSpace).Where(i=>i.ReturnParameter == null);

这返回了正确的架构和存储过程名称。然后我可以调用列表中的每个项目:

var sqlCommands = string.Format("SELECT 'x' FROM sys.objects WHERE object_id = OBJECT_ID(N'{0}') AND type in (N'P', N'PC')", storedProcedureName);
var exists = dbContext.Database.SqlQuery<string>(sqlCommands).Any();

【讨论】:

    【解决方案2】:

    您可以使用 SQL 查询来获取具有它们架构的所有过程,然后您可以将其与您的默认数据库对象集进行比较。 SQL 查询会是这样的:

    SELECT o.name
          ,o.[type]
          ,o.type_desc
          ,s.name
          ,c.name
          ,t.name
          ,c.max_length
          ,c.precision
    FROM   sys.objects o
           INNER JOIN sys.schemas s
                ON  s.[schema_id] = o.[schema_id]
           INNER JOIN sys.[columns] c
                ON  c.[object_id] = o.[object_id]
           INNER JOIN sys.types t
                ON  t.system_type_id = c.system_type_id
                     AND t.user_type_id = c.user_type_id     
    

    【讨论】:

    • 谢谢,从 SQL 获取信息不是我的问题。它从 Entity Framework 获取信息,因此我可以将其与 SQL 进行比较
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多