Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何添加/更新EF core中实体一端的多对多关系_C#_Many To Many_Asp.net Core Webapi_Crud_Ef Core 2.2 - Fatal编程技术网

C# 如何添加/更新EF core中实体一端的多对多关系

C# 如何添加/更新EF core中实体一端的多对多关系,c#,many-to-many,asp.net-core-webapi,crud,ef-core-2.2,C#,Many To Many,Asp.net Core Webapi,Crud,Ef Core 2.2,我们已经访问了EF Core多对多更新的多个链接,但无法找到我们问题的具体答案,也无法明确我们的理解 情景: 我们希望一次性添加/更新实体及其相关的多对多关系(dbset.add()或dbset.update()) 我们正在尝试以下操作,只能添加/更新父实体,而不能添加/更新多对多关系列表。你能帮我们知道哪里错了吗?我们能做些什么 当前模型结构: public class Teacher { [DatabaseGenerated(DatabaseGene

我们已经访问了EF Core多对多更新的多个链接,但无法找到我们问题的具体答案,也无法明确我们的理解

情景: 我们希望一次性添加/更新实体及其相关的多对多关系(dbset.add()或dbset.update())

我们正在尝试以下操作,只能添加/更新父实体,而不能添加/更新多对多关系列表。你能帮我们知道哪里错了吗?我们能做些什么

当前模型结构:


        public class Teacher
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity), Required]
        public long Id { get; set; }
        public string Name { get; set; }
        public List<TeacherDuty> TeacherDuties { get; set; }
    }
    public class Duty
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity), Required]
        public long Id { get; set; }
        public string Description { get; set; }
        public List<TeacherDuty> TeacherDuties { get; set; }
    }
    public class TeacherDuty
    {
        public long TeacherId { get; set; }
        public Teacher Teacher { get; set; }

        public long DutyId { get; set; }
        public Duty Duty { get; set; }
    }


公共班主任
{
[DatabaseGenerated(DatabaseGenerateOptions.Identity),必填]
公共长Id{get;set;}
公共字符串名称{get;set;}
公共列表教师职责{get;set;}
}
公共阶级责任
{
[DatabaseGenerated(DatabaseGenerateOptions.Identity),必填]
公共长Id{get;set;}
公共字符串说明{get;set;}
公共列表教师职责{get;set;}
}
公课教师职责
{
公共长教师ID{get;set;}
公共教师{get;set;}
公共长DutyId{get;set;}
公共责任{get;set;}
}
我们正在尝试使用以下方法添加/更新:

public async Task<Teacher> AddTeacher(Teacher pTeacher)
{
    try
    {
        return await _teacher.AddAsync(pTeacher);
    }
    catch (Exception ex) { throw ex; }
}

public async Task<Teacher> UpdateTeacher(Teacher pTeacher)
{
    try
    {
        return await _teacher.Update(pTeacher);
    }
    catch (Exception ex) { throw ex; }
}
public异步任务AddTeacher(Teacher-pTeacher)
{
尝试
{
返回等待teacher.AddAsync(pTeacher);
}
catch(异常ex){throw ex;}
}
公共异步任务更新服务器(教师服务器)
{
尝试
{
返回等待教师更新(pTech);
}
catch(异常ex){throw ex;}
}
如果可能,请指出我们对概念和解决方案的误解。
谢谢。

我创建了一个演示来添加和编辑教师。(
\u context
是数据库上下文)

添加教师:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Teacher teacher)
    {
        //get your desired dutyId with your own logic
        var SelectedDutyIds = new int[] { 1 };
        var teacherDuties = new List<TeacherDuty>();

        if (ModelState.IsValid)
        {
            _context.Add(teacher);
            await _context.SaveChangesAsync();


            foreach (var id in SelectedDutyIds)
            {
                var item = new TeacherDuty()
                {
                    TeacherId = teacher.Id,
                    DutyId = id,
                };
                teacherDuties.Add(item);
            }
            _context.AddRange(teacherDuties);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(teacher);
    }

请参阅

此文件的可能副本没有提供足够的信息,以了解其仅更新父对象的原因。你能提供一个你正在添加的教师样本以及任务的调用方式吗?下面是更新时教师的样本{“Name”:“Kasperov”,“Id”:1,“teacherDuctions”:[{“TeacherId”:1,“DutyId”:3}]}`-这是我们想要从1中删除DutyId并添加3的时候
 [HttpPost]
 [ValidateAntiForgeryToken]
 public async Task<IActionResult> Edit(long id, Teacher teacher)
    {
        if (id != teacher.Id)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
               //your new dutyIds
                var newSelectedDutyIds = new int[] { 3 };
                var teacherDuties = new List<TeacherDuty>();


                var tdList = await _context.TeacherDuties.Where(td => td.TeacherId == teacher.Id).ToListAsync() ;
                _context.RemoveRange(tdList);

                foreach (var newid in newSelectedDutyIds)
                {
                    var item = new TeacherDuty()
                    {
                        TeacherId = teacher.Id,
                        DutyId = newid,
                    };
                    teacherDuties.Add(item);
                }
                _context.AddRange(teacherDuties);
                _context.Update(teacher);

                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!TeacherExists(teacher.Id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction(nameof(Index));
        }
        return View(teacher);
    }