Замена для 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);
}
Другие вопросы по тегам