Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 自定义setter,用于添加多对多关系.net核心_C#_.net_Entity Framework_Asp.net Core - Fatal编程技术网

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();