多对多关系上的实体不会被删除

问题描述 投票:0回答:1

我正在尝试删除 SentGroupJoinRequest 记录 record of userId and GroupJoinRequestId

它是通过

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表中的字段没有被删除,如何解决?

即使您分别删除不同实体的两个属性,数据库中的记录也不会被删除

c# postgresql entity-framework asp.net-web-api entity-framework-core
1个回答
0
投票

如上所述,当您在首次加载数据时包含“嵌套”对象或在删除时调用嵌套对象时,就会发生“级联”删除。

级联删除请参考此链接 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();
}

现在,当从所述列表中选择一个对象并将其删除时,您不必再次调用所有“嵌套”对象。

当然,请确保保存更改。

© www.soinside.com 2019 - 2024. All rights reserved.