MySql + 实体框架 = 每个派生表都必须有自己的别名

Posted

技术标签:

【中文标题】MySql + 实体框架 = 每个派生表都必须有自己的别名【英文标题】:MySql + entity framework = Every derived table must have its own alias 【发布时间】:2011-10-26 18:27:39 【问题描述】:

我必须从我的 C# 程序中访问其他开发人员的一些 mysql 视图。

所以经过一番搜索,我决定实体框架,并使用这个问题中提到的驱动程序:Using MySQL with Entity Framework (MySQL .NET Connector)。

现在,我正在尝试获取一个视图的第一个元素:

myEntities.events.First();

在那里,我得到了一个例外:

System.Data.EntityCommandExecutionException was unhandled
  Message=An error occurred while executing the command definition. See the inner exception for details.
  Source=System.Data.Entity
  StackTrace:
       at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
       at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
       at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
       at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
       at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
       at System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__0[TResult](IEnumerable`1 sequence)
       at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
       at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
       at System.Linq.Queryable.First[TSource](IQueryable`1 source)
       at J4N.GroopleReports.ReportManager.DataImporter.GenerateEvent(GroopleEntities groopleEntities) in C:\Users\J4N\Dropbox\WorkSpaces\DotNET\GroopleReports\ReportManager\DataImporter.cs:line 35
       at J4N.GroopleReports.ReportManager.DataImporter.Import() in C:\Users\J4N\Dropbox\WorkSpaces\DotNET\GroopleReports\ReportManager\DataImporter.cs:line 17
       at ImportTest.Program.Main(String[] args) in C:\Users\J4N\Dropbox\WorkSpaces\DotNET\GroopleReports\ImportTest\Program.cs:line 15
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: MySql.Data.MySqlClient.MySqlException
       Message=Every derived table must have its own alias
       Source=MySql.Data
       ErrorCode=-2147467259
       Number=1248
       StackTrace:
            at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
            at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& insertedId)
            at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int32& insertedId)
            at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
            at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
            at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
            at MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
            at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
            at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
       InnerException: 

我搜索了这个错误是什么“每个派生表必须有自己的别名”以及如何解决它,我在网上找到了一些关于 SQL 请求有什么问题的响应,但我无法影响实体框架如何构造这些.

【问题讨论】:

我建议改用 NHibernate 我对 EF 没有很好的经验 @Serghei 我已经解决了这个问题一年半 ;) 无论如何感谢您的帮助 @Sorry我没有注意到,因为这个问题被更新了 【参考方案1】:

除了接受的答案之外,应该注意的是,如果您尝试将数据库中的更改保存在没有主键的表上,则会引发相同的异常 (Every derived table must have its own alias)。

这是多年后仍未修复的known bug(于 2012 年 4 月 4 日出现在 MySQL 5.5.22 + .Net/Connector 6.5.4 中)。

我知道没有主键的表不是一个好主意,但由于 DDL 生成器中存在另一个错误,因此在创建关联实体键的属性 StoreGeneratedPattern 设置为 None 时没有主键...

【讨论】:

还应该提到的是,在现实世界中,您通常无法控制底层数据结构,只能尝试解决您可以控制的区域中的任何问题,例如ORM。【参考方案2】:

我也有同样的情况。我的表没有主键,我得到了同样的例外。我的解决方案不是很好,但它可能对某人有用。

var settings = dataModel.Settings.ToList();
var setting = settings[0];

【讨论】:

【参考方案3】:

那些对象关系映射器需要和同一行的 id。它在 ORM 内部使用。我知道其他 ORM 工具,例如 NHibernate 和 Hibernate。一样的小

【讨论】:

以上是关于MySql + 实体框架 = 每个派生表都必须有自己的别名的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的“每个派生表都必须有自己的别名”是啥错误?

MySQL中的“每个派生表都必须有自己的别名”是啥错误?

MySQL UNION - 每个派生表都必须有自己的别名

错误代码:1248。每个派生表都必须有自己的别名 没有找到查询的解决方案

mysql 错误代码 1248

使用实体框架6插入已断开的相关实体