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

4

1 回答 1

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对象中。

于 2015-04-28T07:23:58.227 回答