gpt4 book ai didi

c# - 自定义 setter 添加多对多关系 .net core

转载 作者:行者123 更新时间:2023-12-04 10:32:58 24 4
gpt4 key购买 nike

我有三个表,它们组合起来代表多对多关系。即两个表和一个连接表。

这在代码中以下列方式表示:

public partial class Test1
{
public Test1()
{
Test1_Test2= new HashSet<Test1_Test2>();
}

public int Id { get; set; }
..

public virtual ICollection<Test1_Test2> Test1_Test2{ get; set; }
[NotMapped]
public ICollection<Test2s> Test2
{
get => Test1_Test2.Select(r => r.Test2).ToList();
set => Test1_Test2 = value.Select(v => new Test1_Test2()
{
Test2Id = v.Id
}).ToList();
}
}
public partial class Test2
{
public Test2()
{
Test1_Test2= new HashSet<Test1_Test2>();
}

public int Id { get; set; }
..

public virtual ICollection<Test1_Test2> Test1_Test2{ get; set; }
}
public partial class Test1_Test2
{
public int Test1Id{ get; set; }
public int Test2Id{ get; set; }

public virtual Test1 Test1{ get; set; }
public virtual Test2 Test2{ get; set; }
}

正如您在 Test1 的模型中所见我添加了一个“非映射”实体,用于分别获取Test2的对象,不经过连接表,并在连接表中添加Test1和Test2中两个实体之间的关系。

在这里,我成功地获得了我的 Test2对象通过使用 getter,如下所示:
var variable = _context.Test1.Include(x => x.Test1_Test2).ThenInclude(x => x.Test2).Where(c => c.Id == Test1.Id);

不幸的是,当我尝试在联接表中添加关系时 "Test1_Test2"通过二传手,什么也没发生,这是我的方法:
test1variable.Test2s.Add(test);
_context.Test1.Update(test1variable);
_context.SaveChanges();

我是否错误地使用了我的二传手,或者有更“正确”的方法吗?

最佳答案

我相信覆盖ICollection在您的 setter 中中断了 EF.Core 中的更改跟踪:它仅跟踪原始 ICollection对象,而不是新分配的对象。

相反,尝试在不分配新列表的情况下将项目删除/添加到跟踪集合。 This answer提供了一个带有合适扩展方法的示例,它应该实现与您尝试使用自定义属性实现的功能非常相似的功能。

关于c# - 自定义 setter 添加多对多关系 .net core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60328467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com