带有 Mysql 和 NullReferenceException 的实体框架 6

Posted

技术标签:

【中文标题】带有 Mysql 和 NullReferenceException 的实体框架 6【英文标题】:Entity Framework 6 with Mysql and NullReferenceException 【发布时间】:2014-08-24 01:50:09 【问题描述】:

当我尝试插入相同的数据时,我收到 NullReferenceException 异常。

我在 ***、asp.net 论坛和 mysql 社区论坛中阅读了大量帖子。 对于这个问题,我找不到任何真正的解决方案。对此有很多答案。然而,任何人都解决了我的问题(也是其他人的问题)。我发现了一些关于此类问题的错误报告。但是,每个报告都应在 .Net 连接器 6.8.3 中解决。 我想我在使用 Mysql 的 EF 中缺少非常简单的步骤,但我找不到我的错误...

示例代码:

using (prodEntities myEntity = new prodEntities ())

  userloginlog log = new userloginlog();
  log.UserRef = pUserID;
  log.Success = pSuccess;
  log.IpNo = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
  log.BrowserInfo = browserInfo;
  log.LoginTime = GeneralHelperC.getCompanyDateTime();
  myEntity.userloginlog.Add(log);
  myEntity.SaveChanges();

表:

CREATE TABLE `userloginlog` (
  `RID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `UserRef` bigint(20) unsigned NOT NULL,
  `LoginTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `IpNo` varchar(15) DEFAULT NULL,
  `Success` tinyint(4) NOT NULL,
  `BrowserInfo` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`RID`),
  KEY `userLoginLog_Staff_Key` (`UserRef`),
  CONSTRAINT `UserLoginLog_User_Key` FOREIGN KEY (`UserRef`) REFERENCES `users` (`RID`)
) ENGINE=InnoDB AUTO_INCREMENT=16903 DEFAULT CHARSET=utf8;

例外:

   at MySql.Data.Entity.ListFragment.WriteSql(StringBuilder sql)
   at MySql.Data.Entity.SelectStatement.WriteSql(StringBuilder sql)
   at MySql.Data.Entity.InsertStatement.WriteSql(StringBuilder sql)
   at MySql.Data.Entity.SqlFragment.ToString()
   at MySql.Data.Entity.InsertGenerator.GenerateSQL(DbCommandTree tree)
   at MySql.Data.MySqlClient.MySqlProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree)
   at System.Data.Entity.Core.Common.DbProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Core.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Core.Common.DbProviderServices.CreateCommand(DbCommandTree commandTree, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.CreateCommand(DbModificationCommandTree commandTree)
   at System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.CreateCommand(Dictionary`2 identifierValues)
   at System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary`2 identifierValues, List`1 generatedValues)
   at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()
   at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.<Update>b__2(UpdateTranslator ut)
   at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult, Func`2 updateFunction)
   at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update()
   at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__d()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions options, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction)
   at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClassb.<SaveChangesInternal>b__8()
   at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction)
   at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options)
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()

安装在我的电脑上:

Mysql 服务器 5.6CE MySQL 连接器 NET 6.8.3 Visual Studio 2013

项目中引用的 DLL(每个人都安装了 nuget):

MySql.Data.dll (6.8.3) MySql.Data.Entity.dll (6.7.5) MySql.Data.Entities.dll (6.8.3.0) MySql.Web.dll (6.8.3) EntityFramework.dll (6.1.1)

项目是在.Net Framework 4.0下运行的Asp.Net Webform

非常感谢

【问题讨论】:

可以发实体类吗? 你发帖已经9个月了,你有没有找到根本原因和解决方法?我自己也遇到了完全相同的错误 Também estou com o mesmo erro! 【参考方案1】:

如果您使用的是 Entity Framework 6,则要使用的正确 MySql 数据实体是 MySql.Data.Entity.EF6。我有一个 Webforms 项目,我正在使用 VS 2013 和 MySql。 Mysql 引用如下所示:

您不需要您的MySql.Data.Entity.dll (6.7.5)MySql.Data.Entities.dll (6.8.3.0)

对于您的 Web.config:

 <entityFramework>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient"
                type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient"></remove>
      <add name="MySQL Data Provider"
           invariant="MySql.Data.MySqlClient"
           description=".Net Framework Data Provider for MySQL"
           type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data,  Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

【讨论】:

其实我有两个项目。 Web 其他之一是实体模型项目。实体模型项目引用自 Web 项目。在您回答后,我尝试在 Web 项目中创建新模型,但出现错误:“您的项目引用了最新版本的实体框架;但是,无法为您的数据连接找到与此版本兼容的实体框架数据库提供程序。退出此向导,安装兼容的提供程序,并在执行此操作之前重新构建您的项目“在该错误之后我进行了一些搜索,但任何答案再次解决了我的问题。【参考方案2】:

我们遇到了类似的问题。我们没有 ID 字段,但我们有一个时间戳作为主键。解决方案是引入一个 ID,并将其设置为主键。

【讨论】:

【参考方案3】:

当我仔细观察时,EF 将相关表中的所有字段都视为键。不幸的是,我没有时间进行调查,而是从头开始重新创建表,从模型中删除实体类型并从数据库中重新导入它们。

之后问题就消失了。

【讨论】:

【参考方案4】:

我遇到了与 Balaz Somogyi 相同的问题,这与 OP 的问题相似(我引用了 MySQL.Data 和 MySql.Data.Entity.EF6 的 6.9.7 版)。我有一个以TimeStamp 字段作为主键的日志表。当实体框架生成.edmx 时,它将主键字段上的StoreGeneratedPattern 属性设置为Identity。由于我不依赖实体框架返回插入的TimeStamp,因此我选择将StoreGeneratedPattern 属性设置为None,而不是更改数据库中的表结构。这为我解决了这个问题。

【讨论】:

以上是关于带有 Mysql 和 NullReferenceException 的实体框架 6的主要内容,如果未能解决你的问题,请参考以下文章

带有两个OUT参数和c#的Mysql存储过程

带有 union 和 in 子句的 Mysql 错误

带有 MySQL 和 UTF-8 的 Django [重复]

带有 Mysql 和 NullReferenceException 的实体框架 6

带有 mysql 和 django 的 Docker。尽管有任何尝试,都拒绝连接到 mysql

带有内部连接和限制的mysql删除