所以,我有点难住了。我一直在使用通用存储库,它工作得很好。它位于实体框架 4.1 之上。我曾多次使用同一行代码来获取一组数据,之前没有任何问题。然而,我的数据库中的这张表似乎抛出了异常,我一生都无法弄清楚如何修复它。
这是MySQL数据库中的表设计
Completed
=========
CompletedId
OldStepId
NewStepId
Name
Step
====
StepId
Name
Description
这是 model.cs 定义
public class Completed
{
[Key]
public int CompletedId { get; set; }
public int OldStepId { get; set; }
public int NewStepId { get; set; }
public string Name { get; set; }
public virtual Step OldStep { get; set; }
public virtual Step NewStep { get; set; }
}
public class Step
{
[Key]
public int StepId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
上下文定义
public DbSet<Completed> Completeds { get; set; }
public DbSet<Step> Steps { get; set; }
控制器调用有问题的代码
var completeds = new List<Completed>();
using (var gm = new GenericRepo<Completed>())
{
completeds = gm.Get().ToList();
}
存储库的get方法(简化)
public IEnumerable<T> Get()
{
var context = new exampleContext();
DbSet<T> dbSet = context.Set<T>();
IQueryable<T> query = dbSet;
return query.ToList();
}
这是导航到操作时从浏览器收到的错误
Unknown column 'Extent1.OldStep_StepId' in 'field list'
这是从调试器获得的内部异常
InnerException: MySql.Data.MySqlClient.MySqlException
Message=Unknown column 'Extent1.OldStep_StepId' in 'field list'
Source=MySql.Data
ErrorCode=-2147467259
Number=1054
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)
这是在错误导致应用程序崩溃之前调试器似乎出现问题的查询
{SELECT
`Extent1`.`CompletedId`,
`Extent1`.`OldStepId`,
`Extent1`.`NewStepId`,
`Extent1`.`Name`,
`Extent1`.`OldStep_StepId`,
`Extent1`.`NewStep_StepId`,
`Extent1`.`Step_StepId`,
`Extent1`.`Step_StepId1`
FROM `Completed` AS `Extent1`}
使用反射,我能够确定或至少假设,StepId 未显示为 Step 中的字段的原因可能是因为 Step 出于某种原因定义为“已完成”。情况可能并非如此。我不确定为什么会发生这个错误。
以前有人在实体框架中遇到过类似的事情吗?这是我的代码有问题吗?这是表连接方式的问题吗?我对这个设置有类似的定义,它可以完美地工作,所以我不明白这里的差异。该表与所有其他表之间的唯一区别是对同一对象有两个引用(注意:Completed 类包含两个虚拟 Step 对象)。
另请注意:这是notEF 代码优先。