Я обновляю проект до EFCore 2.2.0 с 2.1.3 и столкнулся с этой странной проблемой. При загрузке данных для простой таблицы я получаю исключение, что «ExchangeCd1» не определен. Этот столбец не существует, но нигде в коде на него нет ссылок. Когда я проверяю свойства сопоставления, я вижу его в списке: {Свойство: ExchangeHoliday.ExchangeCd1 (без поля, строка) Shadow FK Index 2 2 2 0 1}
Классы довольно простые, но дочерние имеет составной первичный ключ, и родитель пытается ссылаться на него, используя свой отдельный ключ.
public class Exchange
{
public string ExchangeCd { get; set; }
public string ExchangeName { get; set; }
public DayOfWeek WeekendStart { get; set; }
public DayOfWeek WeekendEnd { get; set; }
public ICollection<ExchangeHoliday> Holidays { get; set; }
}
public class ExchangeHoliday
{
public string ExchangeCd { get; set; }
public DateTime HolidayDate { get; set; }
public bool IsTradeHoliday { get; set; }
public bool IsSettleHoliday { get; set; }
}
Я добавляю некоторое сопоставление, чтобы определить первичный ключ как составной ключ
modelBuilder.Entity<Exchange>().HasKey(e => e.ExchangeCd);
modelBuilder.Entity<ExchangeHoliday>().HasKey(e => new { e.ExchangeCd, e.HolidayDate });
Затем я выполняю очень простой выбор
var holidays = await dbContext.ExchangeHolidays.ToArrayAsync(cancellationToken).ConfigureAwait(false);
Я включил ведение журнала EFCore SQL, и он генерирует это для SQL
SELECT [e].[exchange_cd], [e].[holiday_date], [e].[ExchangeCd1], [e].[is_settle_holiday], [e].[is_trade_holiday]
FROM [exchange_holiday] AS [e]
Я пытался добавить явное отображение удалить теневой ключ, но он застрял вокруг
modelBuilder.Entity<Exchange>()
.HasMany<ExchangeHoliday>()
.WithOne(e => e.Exchange)
.HasForeignKey(fk => fk.ExchangeCd);