Я создал тестовый проект ASP.NET Core. Я сгенерировал модели из существующей БД с помощью команды Scaffold-DbContext.
Все прошло хорошо. Я добавил ApiController для возврата данных, и если я запрашиваю, используя LINQ, простые данные плоских таблиц или делаю соединения в таблицах, где внешние ключи были явно определены в БД, это работает.
Но если я сделаю запрос, соединяющий две таблицы , где внешние ключи не установлены, он ничего не вернет .
Обратите внимание, что две таблицы связаны друг с другом целочисленным ID ( MktId ).
Модели сущностей, сгенерированные скаффолдом:
public partial class MonthlyPrice
{
public int MpId { get; set; }
public int MktId { get; set; }
public int CmId { get; set; }
public decimal MpPrice { get; set; }
public Commodities Cm { get; set; }
public Currencies Cur { get; set; }
public PriceTypes Pt { get; set; }
public UnitOfMeasure Um { get; set; }
}
public partial class Commodities
{
public Commodities()
{
MonthlyPriceItem = new HashSet<MonthlyPriceItem>();
}
public int CmId { get; set; }
public string CmName { get; set; }
public int CmCatId { get; set; }
public ICollection<MonthlyPrice> MonthlyPriceItem { get; set; }
}
public partial class Markets
{
public int MktId { get; set; }
public string MktName { get; set; }
}
следующий запрос возвращает результаты:
var price= (from m in db.MonthlyPrice
join c in db.Commodities on m.CmId equals c.CmId
select new
{
c.CmName,
m.MpPrice
});
но этот ничего не возвращает:
var price= (from m in db.MonthlyPrice
join mk in db.Markets on m.MktId equals mk.MktId
select new
{
m.MpPrice,
mk.MktName
});
Обратите внимание, что оба запроса на Entity Framework 6.x на ASP.NET 4.7 отлично работают .
Нужно ли указывать весь внешний ключ в БД для корректной работы EFCore?
(Db не всегда спроектирован мной !!)
UPDATE
Конструктор моделей для Markets был сгенерирован командой scaffold-dbcontext следующим образом:
modelBuilder.Entity<Markets1>(entity =>
{
entity.HasKey(e => e.MktId);
entity.ToTable("__Markets");
entity.Property(e => e.MktId).HasColumnName("mkt_id");
entity.Property(e => e.MktName)
.IsRequired()
.HasColumnName("mkt_name")
.HasMaxLength(250);
});
По отношению к сгенерированной для Commodities таблице. Я заметил, что есть строка entity.ToTable ("__ Markets"); , которая выглядит для меня очень странно.