Я столкнулся с той же проблемой с дозвуковой 3 ActiveRecord.Быстрое исследование общего кода показало, что каждый дозвуковой объект ActiveRecord создал новый экземпляр БД, новый репозиторий и новую таблицу.Код в основном:
_db=new Northwind.Data.NorthwindDB();
_repo = new SubSonicRepository<Products>(_db);
tbl=_repo.GetTable();
Это происходит для каждого создаваемого вами экземпляра ActiveRecord.
Если вы работаете с большими наборами данных, шаблоны LinqTemplates занимают меньше памяти.Например, у меня возникла проблема с загрузкой 100000 записей
// ActiveRecord: slow, eventually ended in a OutOfMemoryException
var query = from p in Products.All()
select p;
var products = query.ToList();
// LinqTemplates: runs fast with at least no memory footprint
// (except for the data itself)
var db = new Northwind.Data.NorthwindDB();
var query = from p in db.Products
select p;
var products = query.ToList();
. Паттерн ActiveRecord следует использовать с осторожностью.Он отлично подходит для извлечения одной записи из БД, обновления некоторых значений и сохранения изменений или даже для быстрого обновления нескольких записей (скажем, до 1000 записей), но для большого количества данных это не лучший выбор, посколькунакладные расходы.
В любом случае, извлечение записи из БД только для обновления значения является плохим выбором как для ActiveRecord, так и для LinqTemplates (если только у вас нет для этого веских причин, например, вы внедрили некоторую бизнес-логику в свойОбъекты DAL.)
Рассматривали ли вы просто вместо этого обновление?
db.Update<MyObject>()
.Set(x => x.property1 == 5)
.Set(x => x.property2 == "Hello World")
.Where(x => x.ID == 1)
.Execute();