Отображение и обновление дополнительных файлов EF Core 3.0 - PullRequest
0 голосов
/ 18 октября 2019

ребята.

У меня проблема с отображением и обновлением дополнительных полей.

Давайте создадим простой класс

public class User
{
    [Key]
    public Guid Id { get; set; }

    public string SameField { get; set; }
    public AuxClass AuxClass { get; set; }    
}

public class AuxClass
{
    public Guid Id { get; set; }

    public string? AuxField { get; set; }

    public Guid UserId { get; set; }
    public User User { get; set; }
}
...
DbSet<User> UserDb { get; set; }

Я ожидаю, что такой запрос

var tst = context.UserDb.AsNoTracking().FirstOrDefaultAsync();

возвращает объект следующим образом:

{
    Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
    SameField = "lala",
    AuxClass = null
}

Но я получаю

{
    Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
    SameField = "lala",
    AuxClass = 
    {
        Id = "00000000-0000-0000-0000-000000000000",
        AuxField = null,
        UserId = "00000000-0000-0000-0000-000000000000",
        User = null
    }
}

Итак, первый вопрос - почему? Второй вопрос - как настроить контекст, чтобы не создавать такой объект с помощью запросов?

И третий вопрос.

Предположим, у меня есть объект класса User, подобный этому:

{
    Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
    SameField = "lala",
    AuxClass = 
    {
        Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A83",
        AuxField = "lalala",
        UserId = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
        User = User
    }
}

Я делаю запрос var tst = context.UserDb.AsNoTracking().FirstOrDefaultAsync();, поэтому у меня есть часть объекта из базы данных и вносим изменения:

{
    Id = "AD8E1461-D6E8-4A04-8CFE-08D74FED1A72",
    SameField = "lala12345",
    AuxClass = null
}

Я хочу обновить этот объект в базе данных. Я хочу написать код, подобный этому

context.UserDb.Update(tst);
await context.SaveChangesAsync(true);

, не стирая поле AuxClass в объекте, хранящемся в базе данных. Как это возможно?

Спасибо.

1 Ответ

0 голосов
/ 18 октября 2019

Вы должны определить элементы отношения как виртуальные, и все проблемы решены:

public class User
{
    [Key]
    public Guid Id { get; set; }

    public string SameField { get; set; }
    public virtual AuxClass AuxClass { get; set; }    
}

public class AuxClass
{
    public Guid Id { get; set; }

    public string? AuxField { get; set; }

    public Guid UserId { get; set; }
    public virtual User User { get; set; }
}
...