Отслеживание изменений в столбце json в EF Core 8 и postgresC#

Место общения программистов C#
Ответить
Anonymous
 Отслеживание изменений в столбце json в EF Core 8 и postgres

Сообщение Anonymous »

У меня проблема с отслеживанием изменений в столбце json в EF Core 8 и postgres. Похоже, что явная установка записей как измененных не работает.
Я использую следующие модели:

Код: Выделить всё

public class DocumentReadModelEntity where T : IDocumentReadModel
{
public Guid Id { get; set; }
public T Data { get; set; }

public DocumentReadModelEntity()
{
}

public DocumentReadModelEntity(T data)
{
Data = data;
Id = data.Id;
}
}

Код: Выделить всё

public sealed class SupplierReadModel : IDocumentReadModel
{
public string? Description { get; set; }
public string? Website { get; set; }
public Guid? LogoFileId { get; set; }
public bool IsActive { get; set; }
public bool ShouldSendRemittanceEmail { get; set; }

public List Blocks { get; set; }
public List Estates { get; set; }

public Guid CompanyId { get; set; }
public CompanyShortData? CompanyData { get; set; }

public BankAccountModel? BankAccount { get; set; }
}
Каждое сложное свойство в ПоставщикеReadModel (в данном примере это: ПоставщикБлокМодель, EstateBlockModel, CompanyShortData, BankAccountModel) ) наследовать от

Код: Выделить всё

[Owned]
public abstract class ReadModelDataModel
{
}
Например, PurchaseBlockModel:

Код: Выделить всё

public class SupplierBlockModel : ReadModelDataModel
{
public Guid BlockId { get; set; }
public BlockShortData? BlockData { get; set; }
}
Вложенные свойства также наследуются:

Код: Выделить всё

public class BlockShortData : ReadModelDataModel
{
public string CustomId { get; set; }
public string BlockName { get; set; }
[JsonIgnore]
public string FullName => $"[{CustomId}] {BlockName}";
}
Конфигурация объекта выглядит следующим образом:

Код: Выделить всё

public static void ApplyDefaultConfiguration(this EntityTypeBuilder builder) where T : class, IDocumentReadModel
{
builder.ToTable(typeof(T).Name);

builder.HasKey(x => x.Id);

builder.OwnsOne(x => x.Data, x =>
{
x.ToJson();
});
}
Я запрашиваю DbContext следующим образом:

Код: Выделить всё

return await _entities.AsNoTracking()
.Where(x => ids.Contains(x.Id))
.Select(x => x.Data)
.ToListAsync();
где находится _entities

Код: Выделить всё

_entities = _dbContext.Set();
в общем репозитории

Код: Выделить всё

public class DocumentStore : IDocumentStore where T : class, IDocumentReadModel, new()
Когда я обновляю ПоставщикReadModel и пытаюсь обновить эту запись с помощью этого кода:

Код: Выделить всё

public void Update(T updated)
{
var entity = new DocumentReadModelEntity(updated);
_entities.Entry(entity).State = EntityState.Modified;
}
а затем

Код: Выделить всё

public async Task Save()
{
await _dbContext!.SaveChangesAsync();
}
ничего не сохраняется. Кроме того, когда я смотрю на представление отладки средства отслеживания изменений DbContext, я вижу

Код: Выделить всё

DocumentReadModelEntity {Id: 018d834f-75d9-48eb-8af1-543579976bc5} Modified
Id: '018d834f-75d9-48eb-8af1-543579976bc5' PK
Data: 
Что я делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/779 ... d-postgres
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»