Внешний ключ EF Core сбрасывается свойством навигации при присоединении отключенной записи к контексту
Я создаю серверное приложение blazor с использованием Syncfusion DataGrid, и у меня возникают проблемы с обновлением ForeignKeys, у которых есть свойства навигации. Я использую .Net 6 с Entity Framework Core.
Шаги для описания проблемы следующие:
- Страница Blazor с DataGrid загружается и инициализируется данными контрольной учетной записи
- Запись редактируется пользователем с помощью поля со списком внешнего ключа, привязанного к OBSID_FK. Значение изменено с 5 на 10. В этот момент свойство навигации OBSID устарело и отражает старую запись из OBSID_FK = 5. (Обратите внимание, что в этот момент запись не привязана к контексту, так как находится в сетке , поэтому средство отслеживания изменений не обнаруживает изменения.)
- Пользователь нажимает «Сохранить» и извлекает измененные записи из сетки, готовые к сохранению.
- Создайте новый контекст, прикрепите измененную запись к контексту и сохраните
Проблема возникает при присоединении отключенной измененной записи к контексту. EFCore обнаруживает несоответствие между свойством FK и Navigation и автоматически сбрасывает FK с 10 до исходного значения 5.
Мой вопрос: можно ли указать EFCore использовать значение FK, а не NavigationProperty при разрешении конфликтов при присоединении отключенных объектов к контексту?
Ниже приведены избранные фрагменты кода.
public partial class ControlAccount
{
[Key]
public Guid GUID {get; set;}
public int ID {get; set;}
public string? Code {get; set;}
public string? Description {get; set;}
public int? OBSID_FK {get; set;}
[ForeignKey("OBSID_FK")] public virtual OBSID? OBSID {get; set;}
}
public partial class OBSID
{
[Key]
public int ID { get; set; }
public string? Code { get; set; }
public string? Description { get; set; }
public string? Comments { get; set; }
}
public class Context :DbContext
{
public Context() : base(GetOptions())
{
}
private static DbContextOptions GetOptions()
{
var options = new DbContextOptionsBuilder().UseSqlServer(XXXXXXXXXXXXX).Options;
return options;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies();
}
public DbSet<ControlAccount> ControlAccounts { get; set; }
public DbSet<OBSID> OBSID { get; set; }
}
public class ControlAccountPageTest
{
public void Test()
{
//Retrieve record from db for loading into blazor page
var db = new Context();
var controlAccount = db.ControlAccounts.Include(x => x.OBSID).FirstOrDefault(); //ensure that proxy is loaded
//simulate changing a foreign key value in a drop down box
controlAccount.OBSID_FK = 10; //Change from 5
//simulate retrieving changed record from grid, adding to Context and Saving
using (var db1 = new Context())
{
db1.Update(controlAccount); //***PROBLEM OCCURRS HERE. FOREIGN KEY OBSID_FK = 10 IS OUT OF SYNC WITH NAVIGATION PROPERTY OBSID. EFCORE AUTOMATICALLY RESETS OBSID_FK TO THE NAVIGATION PROPERTY VALUE OF 5
db1.SaveChanges();
}
}
}