![](/img/trans.png)
[英]How do I return a Model from Entity Framework (Database First) that includes the Navigation Properties after the context is disposed?
[英]How do I write a test to verify Entity Framework Database First Model
我有一个实体框架数据库第一模型。
我想编写一个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())
}
我提出的一些问题是,这并不告诉我表是否在不同的模式中。 Schema返回null。 我有多个模式的表。
我也想做一个类似的测试来验证表和视图,它们也在不同的模式中。
我找到了答案:
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();
您可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.