C# 在运行时验证EF数据模型(列出EDMX和SQL数据库架构之间的差异)
我想在应用程序启动时对所有现有的数据模型实体和潜在的存储过程(对照其代表性的数据库表)进行.NET实体框架健康检查。我们使用数据库优先的方法,所以在生产中使用容易出现手动执行错误的SQL脚本进行更改 这将允许我以可控的方式(自定义错误处理)识别任何同步问题(特别是在部署之后)。在新版本部署中提供更高级别的信心,并更快地调试问题 此外,这将添加到自诊断屏幕中,以便基础设施人员可以随时验证数据库运行状况C# 在运行时验证EF数据模型(列出EDMX和SQL数据库架构之间的差异),c#,.net,entity-framework,entity-framework-5,C#,.net,Entity Framework,Entity Framework 5,我想在应用程序启动时对所有现有的数据模型实体和潜在的存储过程(对照其代表性的数据库表)进行.NET实体框架健康检查。我们使用数据库优先的方法,所以在生产中使用容易出现手动执行错误的SQL脚本进行更改 这将允许我以可控的方式(自定义错误处理)识别任何同步问题(特别是在部署之后)。在新版本部署中提供更高级别的信心,并更快地调试问题 此外,这将添加到自诊断屏幕中,以便基础设施人员可以随时验证数据库运行状况 你知道怎么做吗?我似乎找不到执行此操作的本机EF机制,因此当您使用不可预测且容易丢失的错误实体时
你知道怎么做吗?我似乎找不到执行此操作的本机EF机制,因此当您使用不可预测且容易丢失的错误实体时,它将失败。好的,因此我找不到执行此操作的内置机制,因此我必须使用反射来获取DB上下文中的所有实体,然后单独尝试检索FirstOrDefaut()在一次尝试中。虽然它并不完美,但它将为EDMX和数据库之间的一致性提供更高级别的信心
public static List<Type> GetAllEntities()
{
var entityList = new List<Type>();
var context = typeof(<DatabaseContextClass>);
foreach (var property in context.GetProperties())
{
if (!property.PropertyType.IsGenericType
|| property.PropertyType.GetGenericTypeDefinition() != typeof(ObjectSet<>)) // EF 4
continue;
var entityType = property.PropertyType.GetGenericArguements()[0];
entityList.Add(entityType);
return entityList;
}
}
public static T GetFirstObject<T>() where T : EntityObject
{
var context = new <DatabaseContextClass>();
IQueryable<T> = dbQuery = context.CreateObjectSet<T>();
return dbQuery.AQsNoTracking().FirstOrDefault();
}
公共静态列表getAllenties()
{
var entityList=新列表();
var context=typeof();
foreach(context.GetProperties()中的var属性)
{
如果(!property.PropertyType.IsGenericType)
||property.PropertyType.GetGenericTypeDefinition()!=typeof(ObjectSet))//EF 4
继续;
var entityType=property.PropertyType.GetGenericArguements()[0];
entityList.Add(entityType);
返回实体列表;
}
}
公共静态T GetFirstObject(),其中T:EntityObject
{
var context=new();
IQueryable=dbQuery=context.CreateObjectSet();
返回dbQuery.AQsNoTracking().FirstOrDefault();
}
这篇文章可能会给你一些想法,谢谢Steve,这是一篇很好的文章,将与Huagati DBML/EDMX和提到的其他一些比较工具一起使用,但我找不到任何EDMX数据库首次运行时比较的解决方案。看起来似乎没有办法做到这一点。首先切换到代码可能并不像看上去那么糟糕。听起来EDMX将在未来的版本中消失。是的,似乎数据库优先仍然可以完成,但正如您提到的,没有EDMX支持。如果不是因为这个,我肯定会在未来的项目中牢记这一点。是的,我目前的项目我先用一个现有的数据库编写代码,过程非常相似。