【问题标题】:Custom setter to add many-to-many relationship .net core自定义设置器以添加多对多关系 .net 核心
【发布时间】:2020-02-20 21:03:13
【问题描述】:

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

这在代码中表示如下:

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。

在这里,我已经成功地使用 getter 获取了我的 Test2 对象,如下所示:

var variable = _context.Test1.Include(x => x.Test1_Test2).ThenInclude(x => x.Test2).Where(c => c.Id == Test1.Id);

不幸的是,当我尝试通过 setter 在联接表"Test1_Test2" 中添加关系时,什么都没有发生,这是我的方法:

test1variable.Test2s.Add(test);
_context.Test1.Update(test1variable);
_context.SaveChanges();

我是否错误地使用了我的设置器,还是有更“正确”的方法来解决这个问题?

【问题讨论】:

  • test1variable.Test2s的定义是什么?它似乎没有出现在您给出的模型定义中。

标签: c# .net entity-framework asp.net-core


【解决方案1】:

我相信在你的 setter 中覆盖 ICollection 会破坏 EF.Core 中的更改跟踪:它只跟踪原始的 ICollection 对象,而不是新分配的对象。

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

【讨论】:

    【解决方案2】:

    根据您的模型和要求,例如,将 Test1 表 ID 为 1 的数据与 Test2 表 ID 为 4 的数据之间的关系添加到 Test1_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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      相关资源
      最近更新 更多