实体框架 - MySQL - 未知异常

Posted

技术标签:

【中文标题】实体框架 - MySQL - 未知异常【英文标题】:Entity Framework - MySQL - Unknown Exception 【发布时间】:2021-05-03 11:38:45 【问题描述】:

我有一个问题,我不确定是什么原因造成的。我有一个代码优先的实体框架数据库,在第一次运行时一切正常。数据库被创建并且没有抛出异常。

在第二次运行时,当实体框架启动并且我第一次尝试调用“保存”函数时,它会抛出此异常:(我的表中没有一个名为 CreatedOn 的列)

mysql.Data.MySqlClient.MySqlException: 'Unknown column 'CreatedOn' in 'field list'' 

这是我的课

[DbConfigurationType(typeof(MySqlEFConfiguration))]
    public partial class MyContext : DbContext
    
        public MyContext()
            : base("name=MyContext")
        
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration>());

            if (Database.Exists())
            
                if (!Database.CompatibleWithModel(false))
                
                    Database.Initialize(true);
                
            
        
        ...Defining DbSets

我也在使用迁移。

我最初在启动时也遇到了这个异常,但我删除了一些我在启动时添加到数据库中的代码。我认为连接还没有准备好。我假设它与连接没有完全建立有关,但我不知道如何在离开我的 UnitOfWork 课程之前正确确保我们连接。所以我有这个类将我所有的数据库表连接到我的上下文:

 public UnitOfWork(MyContext contextMain)
    
        _context = contextMain;

        _context.Database.CommandTimeout = 600;

        PartFamilies = new PartFamilyRepository(_context);
        PartNumbers = new PartNumberRepository(_context);
        Measurements = new MeasurementRepository(_context);
        Attributes = new AttributeRepository(_context);
        ProgramNumbers = new ProgramNumberRepository(_context);
        FamilyBiases = new FamilyBiasRepository(_context);
        BagQuantities = new BagQuantityRepository(_context);
        UndetectableMods = new UndetectableRepository(_context);
        OverLapParts = new OverLapRepository(_context);
        PartGroups = new PartGroupRepository(_context);
        Settings = new SettingsRepository(_context);

        CreateDefaultDatabase(contextMain.Database.CreateIfNotExists(), _context);
    

最后,当我想使用我的数据库时,我会这样称呼它:

using (var _unitOfWork = new UnitOfWork(new MyContext()))

更新: 我试图关闭实体框架的延迟加载,但这并没有影响异常。我仍然收到它。

这里有一个线索,可以帮助有更多知识的人:

此 ObjectContext 尚未运行,如果我单击该图标来运行线程,我将不再收到此异常。我不知道如何强制这些线程在创建时运行。

我正在使用以下内容:

.NET 框架 4.8

EntityFramework 6.4.4

Mysql.Data 8.0.21

MySql.Data.EntityFramework 8.0.21

【问题讨论】:

您使用的是 DotNet Framework 还是 DotNet-CORE ?如果是“Core”,那么是哪个版本? 2.1 还是 3.1+ ? 我正在使用 .NET Framework 4.8,我也用我的所有依赖项更新了问题。 【参考方案1】:

如果您在调试选项中选中 Just My Code,您应该不会再看到这种情况。这里解释一下:

Error "column c.CreatedOn does not exist..." in PostgreSQL logs during code first context initialization using the Devart dotConnect provider

如果您不想启用“仅我的代码”,则可以在引发异常的地方添加异常处理。以下内容并不优雅,但应该可以:

try

   ...

catch (MySqlException e)

   if(!e.Message.Equals("Unknown column 'CreatedOn' in 'field list'")
   
      throw;
   

【讨论】:

谢谢,但这感觉像是一种解决方法,对我的解决方案来说并不可行。我使用了很多托管和非托管 DLL,我需要能够查看所有异常。这就像我在掩盖被抛出的 MySQL 异常。如果可能的话,我想弄清楚如何解决它。 这并不表示您的代码有任何问题,因此无需修复。 这可能是我创建迁移的方式,因为我的其他项目没有这样做。是否值得重置迁移并重新制作?实体框架的行为会有所不同吗? 不知道会不会有影响。我编辑了我的答案,提出了如何在不打开 Just My Code 的情况下忽略它的建议。 它仍然会遇到异常并在 Try Catch 中达到平衡。我只是点击复选框以忽略这两个 DLL 中的此类异常。感谢您的帮助,这不是我想要解决的方法。我希望实体框架有办法解决这个问题。

以上是关于实体框架 - MySQL - 未知异常的主要内容,如果未能解决你的问题,请参考以下文章

EF:使用typeid映射实体框架层次结构

获取'线程“主”java.lang.IllegalArgumentException中的异常:未知实体:<entityClass>'

静默“未知模块中发生‘System.ExecutionEngineException’类型的未处理异常”错误

异常尝试保存更改时“X”的值未知

在实体框架中找出导致异常的确切实体

如何解决实体框架提供程序异常