C# 如何在启动时根据DB模式检查模型

C# 如何在启动时根据DB模式检查模型,c#,.net,entity-framework-6,code-first,C#,.net,Entity Framework 6,Code First,我有一个缓存数据库,如果模式中缺少新字段,可以简单地删除并重新创建该数据库。我不能为迁移而烦恼,它总是让我感到厌烦 那么我如何执行这个启动检查呢db.Database.CompatibleWithModel返回true,但对不匹配的数据集运行Linq查询将引发异常 关于这类问题的大多数答案都指向迁移。只需使用反射测试所有数据集的可能性: try { using (var db = new MyContext()) { //db.myDataSet.Take(0).

我有一个缓存数据库,如果模式中缺少新字段,可以简单地删除并重新创建该数据库。我不能为迁移而烦恼,它总是让我感到厌烦

那么我如何执行这个启动检查呢
db.Database.CompatibleWithModel
返回true,但对不匹配的数据集运行Linq查询将引发异常


关于这类问题的大多数答案都指向迁移。

只需使用反射测试所有数据集的可能性:

try
{
    using (var db = new MyContext())
    {
        //db.myDataSet.Take(0).SingleOrDefault(); //The following reflection achieves what this line would do
        var t = db.GetType();
        var props = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var prop in props)
        {
            if (!prop.PropertyType.Name.StartsWith("DbSet"))
                continue;
            var getMethod = prop.GetMethod;
            var dataSet = getMethod.Invoke(db, null);
            var dataSetType = dataSet.GetType();
            var queryableType = typeof(Queryable);
            var takeMethod = queryableType.GetMethod("Take");
            takeMethod = takeMethod.MakeGenericMethod(dataSetType.GenericTypeArguments);
            var takeResult = takeMethod.Invoke(null, new object[] { dataSet, 0 });
            var sodMethod = queryableType.GetMethods().Where(m => m.Name == "SingleOrDefault" && m.GetParameters().Length == 1).Single();
            sodMethod = sodMethod.MakeGenericMethod(dataSetType.GenericTypeArguments);
            var finalResult = sodMethod.Invoke(null, new object[] { takeResult });
        }
    }
}
catch (Exception ex)
{
    if (ex.InnerException != null && ex.InnerException.InnerException != null && ex.InnerException.InnerException.Message.StartsWith("Invalid column"))
    {
        MyHelperFunctions.MarkDatabaseForReset();
    }
    else
        throw; //Show error to user - we didn't expect this one
}
有点粗糙,但对我来说很有效。问题的范围很大,但99%的时间都可以解决(例如,代码优先的datacontext上的所有属性通常都是数据集)