Итак, я немного озадачен. Я использовал универсальный репозиторий, и он прекрасно работает. Он находится поверх Entity Framework 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. Это может быть не так. Я не уверен, почему происходит эта ошибка.
Кто-нибудь сталкивался с чем-то подобным с Entity Framework раньше? Это проблема с моим кодом где-нибудь? Это проблема того, как таблицы связаны? У меня есть аналогичные определения для этой установки, которые работают безупречно, поэтому я не понимаю здесь расхождения. Единственная разница между этой таблицей и всеми остальными состоит в том, что есть две ссылки на один и тот же объект (Примечание. Класс Completed содержит два виртуальных объекта Step).
Также обратите внимание: это не EF Code First.