C# EF Sqlserver 生成的实体操作Mysql数据库出现错误

手在键盘敲很轻 2020-09-03 02:39:19
实体类库是4.7.1
在net core3.1控制台上面引用了它,并且测试
我尝试过,如果用mysql生成的实体类库操作,是没问题的,
但遗憾的是mysql生成的实体类都是小写,不大符合我的需求,那样的话会改动比较多的代码。
言归正传,用sqlserver 生成的实体类库操作时报如下错误

System.InvalidCastException
HResult=0x80004002
Message=Unable to cast object of type 'MySql.Data.MySqlClient.MySqlConnection' to type 'System.Data.SqlClient.SqlConnection'.
Source=System.Data.SqlClient
StackTrace:
at System.Data.SqlClient.SqlCommand.set_DbConnection(DbConnection value)
at System.Data.Common.DbCommand.set_Connection(DbConnection value)
at System.Data.Entity.Internal.InterceptableDbCommand.set_DbConnection(DbConnection value)
at System.Data.Common.DbCommand.set_Connection(DbConnection value)
at System.Data.Entity.Core.Common.Utils.CommandHelper.SetStoreProviderCommandState(EntityCommand entityCommand, EntityTransaction entityTransaction, DbCommand storeProviderCommand)
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.PrepareEntityCommandBeforeExecution(EntityCommand entityCommand)
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass41_0.<GetResults>b__1()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass41_0.<GetResults>b__0()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__31_0()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at CSTK.CoreCodeTest.Program.Main(String[] args) in D:\CSTK.Library\CSTK.CoreCodeTest\Program.cs:line 16

如果描述的不够仔细,麻烦指正下
配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="DBOperationSection" type="CSTK.Core.DB.Config.DBOperationSection,CSTK.Core.DBOperator" />
</configSections>
<DBOperationSection>
<add DBKey="LibraryEntities" ConnectionString="libraryEntities" Assembly="./CSTK.Core.DB.EF.dll" Type="CSTK.Core.DB.EF.EFDBOperator" />
</DBOperationSection>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<!--<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />-->
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</providers>
</entityFramework>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.10.9.0" newVersion="6.10.9.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<connectionStrings>
<add name="libraryEntities" connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;user id=root;password=xxx;persistsecurityinfo=True;database=library1"" providerName="System.Data.EntityClient" />
<!--<add name="libraryEntities" connectionString="metadata=res://*/MySqlEntities.csdl|res://*/MySqlEntities.ssdl|res://*/MySqlEntities.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;user id=root;password=xxx;persistsecurityinfo=True;database=library1"" providerName="System.Data.EntityClient" />-->

</connectionStrings>
</configuration>


...全文
11578 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
感谢各位的回复,最终解决方案是重新开一个类库,连接mysql生成实体 在mysql 里面配置 lower_case_table_names=2可实现表名的大小写设置,也就是不默认为小写, 这样的话生成的实体类就与sqlserver生成的实体类大小写一样了,当然,也有不足,在linux操作系统可能会有问题, 另:本人最近在寻求一份新工作,望有需要的大佬推荐下,不胜感激。
正怒月神 2020-09-08
  • 打赏
  • 举报
回复
如果还有问题,那么我觉得,你新开一个类库。 然后单独引用 sqlserver.dll,对数据库进行模型的导出。 而你的网页项目,则使用 mysql.dll
八爻老骥 2020-09-07
  • 打赏
  • 举报
回复
不好意思,看错。1楼正解。
  • 打赏
  • 举报
回复
引用 7 楼 正怒月神 的回复:
另外,如果你实际要在项目中,切换Mysql和sqlserver。 那么上面的provide,就需要动态的切换。 至于怎么吧provide注入到对应的sql,你百度一下。 c#我没搞过这个,java的倒是有。
我这个切换不需要实时的,仅仅是为了将部分表转移到mysql,以达到可跨平台的效果,我的实体确定是通过连接sqlserver数据库生成的,但我接下来是想把这些生成的东西去操作mysql,我认为逻辑上是行的通的。
  • 打赏
  • 举报
回复
引用 8 楼 icoolno1 的回复:
驱动冲突了,用了MySqlClient,就不要安装MySqlConnector
老哥,你这个怎么理解,我尝试过卸载MySqlConnector,还是报同样的错误
正怒月神 2020-09-04
  • 打赏
  • 举报
回复
Unable to cast object of type 'MySql.Data.MySqlClient.MySqlConnection' to type 'System.Data.SqlClient.SqlConnection'. 在connectionString中的最后一个provide里,提供的类型不对。 你既然使用sqlserver,那么连接字符串,也要改。
八爻老骥 2020-09-04
  • 打赏
  • 举报
回复
驱动冲突了,用了MySqlClient,就不要安装MySqlConnector
正怒月神 2020-09-04
  • 打赏
  • 举报
回复
另外,如果你实际要在项目中,切换Mysql和sqlserver。 那么上面的provide,就需要动态的切换。 至于怎么吧provide注入到对应的sql,你百度一下。 c#我没搞过这个,java的倒是有。
正怒月神 2020-09-04
  • 打赏
  • 举报
回复
引用 5 楼 手在键盘敲很轻 的回复:
[quote=引用 4 楼 正怒月神 的回复:][quote=引用 2 楼 手在键盘敲很轻 的回复:]我只是使用了sqlserver生成的实体类,想着用EF实现各种数据库无缝切换。 图上我是切换成mysql数据库
如果连接字符串都不对的话,那么通过sql的dll链接数据库都会出问题, 那就更加不能通过sqlserver生成实体了啊。 [/quote]大佬,你是说我的连接字符串有问题?provider=MySql.Data.MySqlClient; 这个位置,需要改成sqlserver的?[/quote] 是的。
  • 打赏
  • 举报
回复
引用 4 楼 正怒月神 的回复:
[quote=引用 2 楼 手在键盘敲很轻 的回复:]我只是使用了sqlserver生成的实体类,想着用EF实现各种数据库无缝切换。 图上我是切换成mysql数据库
如果连接字符串都不对的话,那么通过sql的dll链接数据库都会出问题, 那就更加不能通过sqlserver生成实体了啊。 [/quote]大佬,你是说我的连接字符串有问题?provider=MySql.Data.MySqlClient; 这个位置,需要改成sqlserver的?
正怒月神 2020-09-04
  • 打赏
  • 举报
回复
引用 2 楼 手在键盘敲很轻 的回复:
我只是使用了sqlserver生成的实体类,想着用EF实现各种数据库无缝切换。 图上我是切换成mysql数据库
如果连接字符串都不对的话,那么通过sql的dll链接数据库都会出问题, 那就更加不能通过sqlserver生成实体了啊。
  • 打赏
  • 举报
回复
引用 1 楼 正怒月神 的回复:
Unable to cast object of type 'MySql.Data.MySqlClient.MySqlConnection' to type 'System.Data.SqlClient.SqlConnection'. 在connectionString中的最后一个provide里,提供的类型不对。 你既然使用sqlserver,那么连接字符串,也要改。
.
  • 打赏
  • 举报
回复
我只是使用了sqlserver生成的实体类,想着用EF实现各种数据库无缝切换。 图上我是切换成mysql数据库

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧