Fur.ExtensionPack
Это полезный пакет расширений для базовой функциональности Fur.
nuget Install-Package Fur.ExtensionPack
Для большинства сущностей необходимо записывать в базу данных время их создания и изменения, а также информацию об операторе. Этот пакет расширения поддерживает автоматическое управление временем создания и изменения сущностей.
Измените базу данных на основе AppDbContext
на AuditingDbContext
.
[AppDbContext("Sqlite3ConnectionString")]
public class FurDbContext : AuditingDbContext<FurDbContext>//<=AppDbContext<FurDbContext>
{
public FurDbContext(DbContextOptions<FurDbContext> options) : base(options)
{
}
protected override void SavingChangesEvent(object sender, SavingChangesEventArgs e)
{
}
}
Затем добавьте интерфейсы ICreationTime
и IUpdateTime
к сущностям, для которых требуется автоматическое управление временем.
public class Person : Entity,ICreationTime,IUpdateTime
{
/// <summary>
/// 构造函数
/// </summary>
public Person()
{
//此行已经不需要,由系统自动管理
CreatedTime = DateTime.Now;
IsDeleted = false;
}
/// <summary>
/// 姓名
/// </summary>
[MaxLength(32)]
public string Name { get; set; }
。。。
}
Таким образом, при создании новой сущности будет автоматически обновляться время создания, а при изменении — записываться время изменения. Кроме того, предотвращается изменение времени создания при обновлении.
В Fur используется Mapster в качестве инструмента отображения. Это мощный и эффективный инструмент. Однако у него есть некоторые недостатки: когда дочерние сущности списка отображаются одновременно как обновление, Mapster сначала очищает список, а затем вставляет его. Это нормально, но для EF это означает, что каждая дочерняя сущность полностью изменена, и для каждой из них генерируется полный SQL-запрос на обновление. Для сложных сущностей это может серьёзно повлиять на производительность. Чтобы решить эту проблему, необходимо сообщить Mapster, какое поле является первичным ключом сущности, и позволить ему найти соответствующее отношение на основе первичного ключа. В этом пакете расширения предоставляется метод расширения AdaptToTrack
, который можно легко вызвать для достижения этой цели. Эта функция основана на реализации Mapster.EFCore.
public async Task Update(PersonInputDto input)
{
var person = await _personRepository.Entities.Include(u => u.PersonDetail).Include(u => u.Childrens).Include(u => u.Posts).SingleAsync(u => u.Id == input.Id.Value);
//直接Adapt,会清空Children列表然后插入,EF将会捕捉到所有Children被更新
// input.Adapt(person);
//AdaptToTrack会检测Children的主键(Id)的对应关系,来进行Map,EF只会捕捉到被修改过的更新
input.AdaptToTrack(person);
await _personRepository.UpdateAsync(person);
}
Просто наследуйте соответствующий интерфейс класса от CrudService
, чтобы легко реализовать операции добавления, удаления, изменения и запроса.
public class StudentService : CrudService<StudentDto, Student>, IDynamicApiController
{
}
Все методы CrudService
являются виртуальными, вы можете свободно переопределять их. Также можно настроить следующие параметры:
IsFakeDelete
: указывает, является ли удаление мягким удалением. По умолчанию значение определяется на основе того, имеет ли сущность атрибут [FakeDelete]
.IsCalculateCount
: определяет, подсчитывается ли количество результатов при вызове метода List
. Поскольку эта операция использует Count
для вычисления, она может увеличить время отклика. Значение по умолчанию — True
.
Помимо методов CreateAsync
, UpdateAsync
, Find
, List
и DeleteAsync
, поддерживаются следующие методы:CreateFilterQuery
: используется для генерации выражения Where
. По умолчанию используется System.Linq.Dynamic.Core
, но вы можете использовать свою собственную реализацию.CreateEntityQuery
: выполняет дополнительные операции над запросом сущности при использовании методов Update
и Get
, таких как добавление Include
или Join
. Обратите внимание, что параметр Query
уже содержит выражение Where
, поэтому сложные Include
могут быть безопасно загружены с использованием Load
.CreateListQuery
: выполняет дополнительные операции над списком запросов при использовании метода List
, такие как добавление Include
или Join
. Обратите внимание, что параметр Query
уже содержит выражение Where
, поэтому сложные Include
могут быть безопасно загружены с использованием Load
.Feat_xxx
.Readme_XXX.md
для поддержки разных языков, например Readme_en.md
, Readme_zh.md
.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )