Reputation: 171
I have created an API with .Net core
and EFCore
following this tutorial using the VSCode.
I have a lot of Models of my MySQL database, because i'm "migrating" my EF6
with asp.net WebAPI
to .Net core
, so i just have copied and paste to avoid a lot of work (again).
When i try to do a simple Get
, the EFCore is concatenating two columns of diferent tables:
The Controller User
[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();
}
}
The 'user' model
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
}
The table 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; }
}
The terminal log during the get request
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()
Please, note that the field u.account_typeid
really doesn't exists. It is a concatenate of account_type
of user
table and id
of account_type
table.
Why it is happening?
Many thanks and sorry for my terible English
Upvotes: 3
Views: 2462
Reputation: 205609
This is explained in the Relationships - No Foreign Key Property section of the EF Core documentation:
If no foreign key property is found, a shadow foreign key property will be introduced with the name
<navigation property name><principal key property name>
You need to specify the FK property for the user.account_type
navigation property by either data annotation:
[ForeignKey("id_account_type")]
public virtual account_type account_type { get; set; }
or fluent API:
modelBuilder.Entity<user>()
.HasOne(e => e.account_type)
.WithMany(e => e.user)
.HasForeignKey(e => e.id_account_type);
Upvotes: 8