C# 自定义setter,用于添加多对多关系.net核心
我有三个表,它们组合在一起表示多对多关系。即,两个表和一个连接表 这在代码中以以下方式表示:C# 自定义setter,用于添加多对多关系.net核心,c#,.net,entity-framework,asp.net-core,C#,.net,Entity Framework,Asp.net Core,我有三个表,它们组合在一起表示多对多关系。即,两个表和一个连接表 这在代码中以以下方式表示: public partial class Test1 { public Test1() { Test1_Test2= new HashSet<Test1_Test2>(); } public int Id { get; set; } .. public virtual ICollection<Test1_Test2&g
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();
}
}
正如您在Test1
的模型中所看到的,我添加了一个“非映射”实体,用于分别获取Test2的对象,而无需通过联接表,并在联接表中添加Test1和Test2中两个实体之间的关系
在这里,我通过使用getter成功地获得了我的Test2
对象,如下所示:
var variable = _context.Test1.Include(x => x.Test1_Test2).ThenInclude(x => x.Test2).Where(c => c.Id == Test1.Id);
不幸的是,当我试图通过setter在连接表“Test1\u Test2”
中添加关系时,实际上什么都没有发生,这是我的方法:
test1variable.Test2s.Add(test);
_context.Test1.Update(test1variable);
_context.SaveChanges();
我是否错误地使用了setter,或者是否有更“正确”的方法 基于您的模型和需求,例如,将Test1表Id为1的数据和Test2表Id为4的数据之间的关系添加到Test1\u Test2表中 请参阅以下代码:
Test1 test1variable = _context.Test1.SingleOrDefault(n => n.Id == 1);
Test2 test = _context.Test2.SingleOrDefault(n => n.Id == 4);
Test1_Test2 test1_2 = new Test1_Test2 { Test1 = test1variable, Test2 = test };
test1variable.Test1_Test2.Add(test1_2);
_context.SaveChanges();
我认为在setter中覆盖
ICollection
会破坏EF.Core中的更改跟踪:它只跟踪原始ICollection
对象,而不是新分配的对象
相反,尝试在不分配新列表的情况下删除/添加跟踪集合中的项目。提供了一个具有适当扩展方法的示例,该方法应实现与您尝试使用自定义属性实现的功能非常相似的功能。test1variable.Test2s的定义是什么?它似乎没有出现在您给出的模型定义中。
test1variable.Test2s.Add(test);
_context.Test1.Update(test1variable);
_context.SaveChanges();
Test1 test1variable = _context.Test1.SingleOrDefault(n => n.Id == 1);
Test2 test = _context.Test2.SingleOrDefault(n => n.Id == 4);
Test1_Test2 test1_2 = new Test1_Test2 { Test1 = test1variable, Test2 = test };
test1variable.Test1_Test2.Add(test1_2);
_context.SaveChanges();