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”命令时,它总是将新数据插入到颜色查找表中。有没有办法插入具有选定颜色的人物记录而不影响颜色表?
答案 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
。