我正在try 删除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"));
        }
    }
}

为什么没有在UserJoinRequest表中删除该字段,我如何解决它?

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

推荐答案

如上所述,当您在第一次加载数据或在删除时调用嵌套对象时包含"嵌套"对象时,就会发生"级联"删除.

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

现在,当从所述列表中 Select 一个对象并将其移除时,您不必再次调用所有的"嵌套"对象.

请参阅此链接以了解"紧急加载". https://learn.microsoft.com/en-us/ef/core/querying/related-data/eager

您还会注意到,如果您进行调试,如果您不急于加载,那么您的变量将使其"嵌套"对象返回空.

然后,确保你保存你的更改当然.

Csharp相关问答推荐

如果第一个匹配项为空,则规则运算不会拆分C#中分离字符串上的子菜单

EF Core Fluent API中定义的多对多关系

向类注入一个工厂来创建一些资源是一个好的实践吗?

错误401未授权ASP.NET Core.使用JWT创建身份验证/授权

如何从泛型方法返回一个可为空的T,其中T:notnull?

在FilePath中搜索一个词,并根据First Match从左到右提取文件路径

HttpConext.Request.Path和HttpConext.GetEndpoint()之间的差异

如何在C#中实现非抛出`MinBy`?

如何向事件添加成员

异步任务调用程序集

在扩展方法中,IEnumerable<;T>;不会转换为IEumerable<;T&>

JSON串行化程序问题.SQLite中的空值

用于请求用户返回列表的C#Google API

将字符串类型日期输入(yyyy-mm-ddthh:mm:ss)转换为MM/dd/yyyy格式

C#中使用ReadOnlySpan的泛型类型推理

如何将 colored颜色 转换为KnownColor名称?

如何读取TagHelper属性的文本值?

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)

嵌套Blazor组件内的验证

测试单个对象是否与Func<;T,bool>;匹配