Замена для sqlite-расширений: InsertWithChildren (слишком много переменных)
У меня есть проект здесь, где большое количество данных читается из разных источников. В специальной логике data/object-modell строится с этими данными. В результате я получаю полную объектную модель с поддержкой SQLite.
Данные были ранее записаны в базу данных SQLite с помощью простого:
_connection.InsertWithChildren(model, true);
Но, поскольку источник данных стал больше, это больше невозможно, потому что метод Insert вызовет исключение "слишком много переменных".;(
Теперь я ищу замену этому методу. Трудность заключается в том, что в моей модели у меня почти всегда есть Foreign-Keys в обоих направлениях. Родитель имеет Чайлдс, Чайлдс знает Родителя.
Производительность не проблема. Мне все равно, если функция требует 10 секунд или 5 минут. Но есть ли у кого-нибудь идея, как обрабатывать вставку, когда все внешние ключи заполнены правильно?
Если я использую простой
foreach(var entity in _entityList)
_connection.Insert(entity);
все внешние ключи (идентификаторы) - Guid.Empty;
С наилучшими пожеланиями и приветствиями,
Крис
1 ответ
Пока проблема № 64 не будет решена, вы можете использовать ReadOnly
свойства в списках.
Например:
public class Foo
{
[PrimaryKey]
public Guid Id { get; set; }
[OneToMany(ReadOnly = true)]
public List<Bar> Bars { get; set; }
}
public class Bar
{
[PrimaryKey]
public Guid Id { get; set; }
[ForeignKey(typeof(Foo))]
public Guid ParentId { get; set; }
[ManyToOne]
public Foo ParentFoo { get; set; }
}
Больше не будет сталкиваться с проблемой ограничения лимита независимо от выполняемой операции.
Теперь вы можете безопасно вставлять элементы:
// Insert parent 'foo' element
// This won't insert the children or update their foreign keys
conn.InsertWithChildren(foo);
// Insert all children
// This will also update ParentId foreign key if ParentFoo property is set
conn.InsertAllWithChildren(bars)
Или используйте простые методы SQLite.Net, присваивая внешние ключи самостоятельно:
conn.Insert(foo);
foreach (var bar in bars) {
bar.ParentId = foo.Id;
conn.Insert(bar);
}