У нас есть простая база данных, но она может содержать тысячи строк. Мы пытаемся создать простой, легкий слой ORM поверх него. Подумайте, Dapper. Тем не менее, мы пытаемся выяснить, как обеспечить наличие одного и только одного объекта на идентификатор.Каков наиболее эффективный способ реализации простой структуры ORM?
Рассмотрим следующие данные:
ID Last First
===== ========== =======
19 Donnely Rick
20 Donovan Sarah
21 Edwards Sandra
Теперь рассмотрим следующий SQL, который используется для создания объектов Person в ORM слое.
Select * From People Where ID = 20;
Select * From People Where LastName Like 'Don*'
В первом случае, вы получите обратно «Donovan», но во втором, вы получите обратно как «Donovan» и «Donnely». Поскольку Донован уже был возвращен, мы хотим, чтобы этот экземпляр вернулся.
Теперь, конечно, вам понадобится некоторый поиск по ID. Это легко. Что не является запросом базы данных, возвратом строк, а затем определением того, что при создании объектов вам нужно либо создать новый, либо обновить существующий (в случае изменения данных.)
Единственное, что я могу придумать имеет метод поиска GetObjectById, который либо возвращает существующий объект, либо создает новый, сохраняет его, а затем возвращает это. Я предполагаю, что это также должно быть основано на слабых ссылках, чтобы они не просто «зависали» в памяти все время.
// Assume the implementation stores the references weakly
public Person GetPersonById(int id)
{
Person person = this[id]; // assume this returns null if not found
if(person == null)
{
person = new Person(id);
this[id] = person;
}
return person;
}
... или я все об этом не так?
Если это верно, почему имеет значение, если вы создаете дубликаты или просто возвращаете оригинал? – Rob
Вы правы. Я оставил соответствующую информацию. Когда я начал объяснять это, я понял, что это лишний вопрос, поэтому я удалил все ссылки только на чтение, чтобы не отправлять людей по неправильному пути. Спасибо за хедз-ап. – MarqueIV
В этом случае ваш подход кажется таким же хорошим, как вы собираетесь получить, если вы правильно используете слабые ссылки. Другой альтернативой является то, что пользователь явно получает и освобождает строки – Rob