[英]Use the Best Practice for Relation Delete in EF Core
我在數據庫中有2個表格: User
和User Role
,它們具有一對多的關系。
User => public ICollection<UserRole> UserRoles { get; set; }
public ICollection<UserRole> UserRoles { get; set; }
UserRole => public User User { get; set; }
public User User { get; set; }
現在我需要刪除User,然后在UserRole
中將其刪除。
我寫這段代碼:
public async Task<ReturnResult> DeleteUser(DeleteDto deleteDto, CancellationToken cancellationToken)
{
var user = userManager.Users.Include(x => x.UserRoles).FirstOrDefault(c => c.Id == deleteDto.id);
user.UserRoles.Remove(user.UserRoles.OrderBy(c => c.UserId).FirstOrDefault(x => x.UserId == user.Id));
await _userService.DeleteAsync(user, cancellationToken);
return Ok();
}
它的工作,但是我需要編寫最好的代碼才能使用最好的性能。
如何提高此代碼的效率?
如何提高此代碼的效率?
配置數據庫以對User和UserRole之間的Foreign Key約束實施級聯刪除,然后從EF中,您可以簡單地刪除User。
請參閱級聯刪除-EF Core
而且,您可以刪除實體而無需先查詢它。 只需使用鍵屬性構造一個實體實例,然后將其以delted狀態附加到DbContext。
您的控制器可以很簡單:
public async Task<ReturnResult> DeleteUser(DeleteDto deleteDto, CancellationToken cancellationToken)
{
using (var db = new Db())
{
db.Users.Remove(new User() { Id = deleteDto.id });
await db.SaveChangesAsync(cancellationToken);
}
return Ok();
}
沒有級聯刪除,唯一有效的方法是使用存儲命令。 例如:
public async Task<ReturnResult> DeleteUser(DeleteDto deleteDto, CancellationToken cancellationToken)
{
using (var db = new Db())
using (var tran = db.Database.BeginTransaction())
{
await db.Database.ExecuteSqlCommandAsync("delete from UserRole where UserId = @id", cancellationToken, deleteDto.id);
await db.Database.ExecuteSqlCommandAsync("delete from User where UserId = @id", cancellationToken, deleteDto.id);
tran.Commit();
}
return Ok();
}
在onMOdelCreating函數中,在Entities類中編寫:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>()
.HasMany(e => e.UserRole)
.WithRequired(e => e.User)
.HasForeignKey(e => e.UserId)
.WillCascadeOnDelete(true);
}
在此片段代碼中,刪除用戶后刪除所有用戶角色。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.