查找表的多对多关系

时间:2015-04-27 21:48:46

标签: sqlite-net sqlite-net-extensions

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之间建立多对多的关系。颜色表将预先填充静态数据。

现在的问题是,每当我执行“InsertWithChildrenAsync”命令时,它总是将新数据插入到颜色查找表中。有没有办法插入具有选定颜色的人物记录而不影响颜色表?

1 个答案:

答案 0 :(得分:1)

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

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

这样,库就不会对该表执行递归写操作。

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

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

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