带有 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的主要内容,如果未能解决你的问题,请参考以下文章
带有 MySQL 和 UTF-8 的 Django [重复]
带有 Mysql 和 NullReferenceException 的实体框架 6