EFCore выбирает неправильное имя столбца - PullRequest
0 голосов
/ 27 апреля 2018

Я создал API с .Net core и EFCore, следуя этому учебнику с использованием VSCode.

У меня есть много моделей моей базы данных MySQL, потому что я "мигрирую" свои EF6 с asp.net WebAPI на .Net core, поэтому я просто скопировал и вставил, чтобы избежать большой работы (снова) ,

Когда я пытаюсь сделать простой Get, EFCore объединяет два столбца разных таблиц:

Пользователь контроллера

[Route("v1/[controller]")]
public class UserController : Controller
{

    private readonly IntentContext _context;

    public UserController(IntentContext context)
    {
        _context = context;
    }

    [HttpGet]
    public IEnumerable<user> GetAll()
    {
        return _context.user.ToList();
    }
}

Модель «пользователя»

public class user
{
    public user()
    {
        user_image = new HashSet<user_image>();
        user_credit_card = new HashSet<user_credit_card>();
        user_pocket_history = new HashSet<user_pocket_history>();
        user_pocket = new HashSet<user_pocket>();

        //A lot of table instances
    }

    public string id { get; set; }
    public string username { get; set; }
    public string password { get; set; }
    public string id_account_type { get; set; }
    public int user_status { get; set; }
    public DateTime create_time { get; set; }
    public DateTime update_time { get; set; }

    public virtual account_type account_type { get; set; }

    public virtual ICollection<user_image> user_image { get; set; }
    public virtual ICollection<user_credit_card> user_credit_card { get; set; }
    public virtual ICollection<user_pocket_history> user_pocket_history { get; set; }
    public virtual ICollection<user_pocket> user_pocket { get; set; }

    //A lot of table relations
}

Таблица account_type

public class account_type
{
    public account_type()
    {
        this.user = new HashSet<user>();
        this.establishment_employee = new HashSet<establishment_employee>();
    }

    public string id { get; set; }
    public string account_description { get; set; }
    public string account_name { get; set; }
    public DateTime create_time { get; set; }
    public DateTime update_time { get; set; }

    public virtual ICollection<user> user { get; set; }
    public virtual ICollection<establishment_employee> establishment_employee { get; set; }
}

Журнал терминала при получении запроса

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
  Failed executing DbCommand (140ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
  SELECT `u`.`id`, `u`.`Id_account_type`, `u`.`account_typeid`, `u`.`create_time`, `u`.`password`, `u`.`update_time`, `u`.`user_status`, `u`.`username`
  FROM `user` AS `u`
MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'u.account_typeid' in 'field list' ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column **'u.account_typeid'** in 'field list'
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

//A lot of exceptions generated 

fail: Microsoft.EntityFrameworkCore.Query[10100]
  An exception occurred in the database while iterating the results of a query for context type 'IntentAPI.Models.IntentContext'.
  MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'u.account_typeid' in 'field list' ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'u.account_typeid' in 'field list'
     at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

Обратите внимание, что поле u.account_typeid действительно не существует. Это объединение account_type из user таблицы и id из account_type таблицы.

Почему это происходит?

Большое спасибо и извините за мой замечательный английский

1 Ответ

0 голосов
/ 27 апреля 2018

Это объясняется в разделе Отношения - Нет свойства внешнего ключа в документации EF Core:

Если свойство внешнего ключа не найдено, свойство теневого внешнего ключа будет введено с именем

<имя свойства навигации> <имя свойства основного ключа>

Необходимо указать свойство FK для свойства навигации user.account_type с помощью аннотации данных:

[ForeignKey("id_account_type")]
public virtual account_type account_type { get; set; }

или свободный API:

modelBuilder.Entity<user>()
    .HasOne(e => e.account_type)
    .WithMany(e => e.user)
    .HasForeignKey(e => e.id_account_type);
...