Внешний ключ EF Core сбрасывается свойством навигации при присоединении отключенной записи к контексту

Я создаю серверное приложение blazor с использованием Syncfusion DataGrid, и у меня возникают проблемы с обновлением ForeignKeys, у которых есть свойства навигации. Я использую .Net 6 с Entity Framework Core.

Шаги для описания проблемы следующие:

  1. Страница Blazor с DataGrid загружается и инициализируется данными контрольной учетной записи
  2. Запись редактируется пользователем с помощью поля со списком внешнего ключа, привязанного к OBSID_FK. Значение изменено с 5 на 10. В этот момент свойство навигации OBSID устарело и отражает старую запись из OBSID_FK = 5. (Обратите внимание, что в этот момент запись не привязана к контексту, так как находится в сетке , поэтому средство отслеживания изменений не обнаруживает изменения.)
  3. Пользователь нажимает «Сохранить» и извлекает измененные записи из сетки, готовые к сохранению.
  4. Создайте новый контекст, прикрепите измененную запись к контексту и сохраните

Проблема возникает при присоединении отключенной измененной записи к контексту. 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();
        }            
    }
}

0 ответов