我正在尝试删除 SentGroupJoinRequest 记录
它是通过
User
实体与 SentGroupJoinRequests
字段以及按 JoinRequests
字段分组之间的关系创建的,但是当访问和删除每个实体的属性时,它们并没有从表中删除。
方法如下:
public async Task<ServiceResponse<string>> AcceptJoinRequest(int groupId, string memberId)
{
var serviceResponse = new ServiceResponse<string>();
try
{
var group = await _context.Groups.FindAsync(groupId) ?? throw new Exception("Group not found.");
if (group.OwnerId != _http.HttpContext.User.FindFirstValue("Id"))
{
throw new Exception("You are not group owner.");
}
var userRequest = await _context.Users.FindAsync(memberId) ?? throw new Exception("User not found.");
if (group.Followers.Contains(userRequest))
{
throw new Exception("User already in a group.");
}
group.Followers.Add(userRequest);
userRequest.Groups.Add(group);
userRequest.SentGroupJoinRequests.Remove(group);
group.JoinRequests.Remove(userRequest);
await _context.SaveChangesAsync();
serviceResponse.Message = "You have approved the application.";
serviceResponse.Success = true;
}
catch (Exception ex)
{
serviceResponse.Success = false;
serviceResponse.Message = ex.Message;
}
return serviceResponse;
}
User
实体:
namespace SocialNetwork.Entities
{
public class User
{
public string Id { get; set; } = string.Empty;
public string Surname { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public DateTime Birthday { get; set; }
public string Location { get; set; } = string.Empty;
public List<Group> Groups { get; set; } = [];
public List<Group> SentGroupJoinRequests { get; set; } = [];
}
}
Group
实体:
namespace SocialNetwork.Entities
{
public class Group
{
public int Id { get; set; }
public string OwnerId { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public List<Post> Posts { get; set; } = [];
public List<User> Followers { get; set; } = [];
public List<User> JoinRequests { get; set; } = [];
public bool IsClosed { get; set; }
}
}
数据库设置:
namespace SocialNetwork.Data
{
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}
public DbSet<User> Users { get; set; }
public DbSet<MetaData> MetaDatas { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<Group> Groups { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.Groups)
.WithMany(f => f.Followers)
.UsingEntity(j => j.ToTable("UserGroups"));
modelBuilder.Entity<User>()
.HasMany(u => u.SentGroupJoinRequests)
.WithMany(j => j.JoinRequests)
.UsingEntity(j => j.ToTable("UserJoinRequests"));
}
}
}
为什么UserJoinRequests表中的字段没有被删除,如何解决?
即使您分别删除不同实体的两个属性,数据库中的记录也不会被删除
如上所述,当您在首次加载数据时包含“嵌套”对象或在删除时调用嵌套对象时,就会发生“级联”删除。
级联删除请参考此链接 https://learn.microsoft.com/en-us/ef/core/ saving/cascade-delete
using var context = new BlogsContext();
var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();
context.Remove(blog);
context.SaveChanges();
在此代码中,如果您在加载嵌套对象时尚未调用嵌套对象,例如首先调用列表,则已调用它们。
using (var context = new BloggingContext())
{
var blogs = context.Blogs
.Include(blog => blog.Posts)
.Include(blog => blog.Owner)
.ToList();
}
现在,当从所述列表中选择一个对象并将其删除时,您不必再次调用所有“嵌套”对象。
当然,请确保保存更改。