与查找表的多对多关系

Many to Many relationships with look up tables

public class Person {
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [ManyToMany(typeof(PersonColor), CascadeOperations = CascadeOperation.All)]
    public List<Color> FavoriteColors { get; set; } 
}

public class Color {
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }

    [ManyToMany(typeof(PersonColor))]
    public List<Person> People { get; set; }
}

public class PersonColor {
    [ForeignKey(typeof(Person))]
    public int PersonId { get; set; }

    [ForeignKey(typeof(Color))]
    public int ColorId { get; set; }
}

...

var person = new Person() {
    FirstName = "Adrian",
    LastName = "Simbulan",
    FavoriteColors = new List<Color>() {
        new Color() {Name = "Red"},
        new Color() {Name = "Green"}
    }
};

await _db.InsertWithChildrenAsync(person);

好的,所以我正在尝试在 Person 和 Color 之间建立多对多关系。颜色 table 将预先填充静态数据。

现在的问题是,每当我执行 "InsertWithChildrenAsync" 命令时,它总是将新数据插入颜色查找 table。有没有一种方法可以在不影响颜色的情况下插入具有选定颜色的人物记录 table?

尝试从 FavoriteColors 属性中删除写入级联操作:

[ManyToMany(typeof(PersonColor), CascadeOperations = CascadeOperation.CascadeRead)]
public List<Color> FavoriteColors { get; set; }

这样库就不会在 table 上执行递归写入操作。


另一种不修改关系的方法是执行两步操作。先插入对象再更新关系:

await _db.InsertAsync(person);
await _db.UpdateWithChildrenAsync(person);

在这两种情况下,FavoriteColors 列表中的对象应该已经存在于数据库中,并且应该分配了一个有效的主键。据此,您的示例代码将永远无法工作,因为标识符在所有 Color 个对象中都是 0