字段列表中的 EF4 未知列

Tra*_*s J 2 c# entity-framework-4.1 asp.net-mvc-3

所以,我有点难住了。我一直在使用通用存储库,它运行良好。它位于实体框架 4.1 之上。我曾多次使用同一行代码获取一组数据,之前没有出现任何问题。但是,我数据库中的这个表似乎抛出了一个异常,我一生都无法弄清楚如何修复它。

这是MySQL数据库中的表设计

Completed
=========
CompletedId
OldStepId
NewStepId
Name

Step
====
StepId
Name
Description
Run Code Online (Sandbox Code Playgroud)

这是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; }
}
Run Code Online (Sandbox Code Playgroud)

上下文定义

public DbSet<Completed> Completeds { get; set; }
public DbSet<Step> Steps { get; set; }
Run Code Online (Sandbox Code Playgroud)

有问题的控制器调用代码

var completeds = new List<Completed>();
using (var gm = new GenericRepo<Completed>())
{
  completeds = gm.Get().ToList();
}
Run Code Online (Sandbox Code Playgroud)

仓库的get方法(简化)

public IEnumerable<T> Get()
{
 var context = new exampleContext();
 DbSet<T> dbSet = context.Set<T>();
 IQueryable<T> query = dbSet;
 return query.ToList();
}
Run Code Online (Sandbox Code Playgroud)

这是我在导航到操作时从浏览器收到的错误

Unknown column 'Extent1.OldStep_StepId' in 'field list'
Run Code Online (Sandbox Code Playgroud)

这是从调试器获得的内部异常

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)
Run Code Online (Sandbox Code Playgroud)

这是在错误使应用程序崩溃之前似乎有来自调试器的问题的查询

{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`}
Run Code Online (Sandbox Code Playgroud)

使用反射,我能够确定,或者至少假设,StepId 没有显示为 Step 中的字段的原因可能是因为 Step 被定义为已完成的任何原因。情况可能并非如此。我不确定为什么会发生此错误。

以前有没有人在实体框架中遇到过这样的事情?这是我的代码在某处的问题吗?这是表格连接方式的问题吗?我对这个设置有类似的定义,可以完美地工作,所以我不明白这里的差异。此表与所有其他表之间的唯一区别是对同一个对象有两个引用(注意:Completed 类包含两个虚拟 Step 对象)。

另请注意:这不是EF Code First。

Not*_*ple 5

我认为这个问题是因为您尚未将导航属性配置为使用您定义的 FK 字段。

你应该使用:

modelBuilder.Entity<Completed>().HasRequired(e => e.OldStep ).WithMany().HasForeignKey(e => e.OldStepId )
Run Code Online (Sandbox Code Playgroud)

或尝试:

public class Completed
{
    [Key]
    public int CompletedId { get; set; }

    public int OldStepId { get; set; }
    public int NewStepId { get; set; }
    public string Name { get; set; }
        
    [ForeignKey("OldStepId")]
    public virtual Step OldStep { get; set; }

    [ForeignKey("NewStepId")]
    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; }
}
Run Code Online (Sandbox Code Playgroud)

参考http://xhalent.wordpress.com/2011/01/21/configuring-entity-framework-4-codefirst/