2015-09-15 3 views
0

У нас есть простая база данных, но она может содержать тысячи строк. Мы пытаемся создать простой, легкий слой 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; 
} 

... или я все об этом не так?

+0

Если это верно, почему имеет значение, если вы создаете дубликаты или просто возвращаете оригинал? – Rob

+1

Вы правы. Я оставил соответствующую информацию. Когда я начал объяснять это, я понял, что это лишний вопрос, поэтому я удалил все ссылки только на чтение, чтобы не отправлять людей по неправильному пути. Спасибо за хедз-ап. – MarqueIV

+0

В этом случае ваш подход кажется таким же хорошим, как вы собираетесь получить, если вы правильно используете слабые ссылки. Другой альтернативой является то, что пользователь явно получает и освобождает строки – Rob

ответ

2

Один из вариантов заключается в использовании CSLA framework. Это не ORM, это «интеллектуальный объект». Он имеет простое и эффективное отслеживание изменений объектов и коллекций сущностей-потомков. Он также имеет несколько дополнительных функций, таких как:

  1. Возможность конфигурировать приложение как двухуровневое или трехуровневое приложение через файл конфигурации.
  2. Ролевая безопасность.
  3. Официальные правила валидации (включая поддержку атрибутов проверки).
  4. Формализованные бизнес-правила (для синхронизации данных между объектами).
  5. Несколько вариантов настройки уровня данных с поддержкой любого механизма сохранения данных.
  6. Поддержка практически любых пользовательских интерфейсов в .NET.
  7. Несколько прототипов объектов, включающих объекты или коллекции только для чтения или чтения-записи.

Недостатком является то, что для обучения каркасу достаточно учебной кривой (хотя есть хорошая документация), и это не очень дружественный интерфейс DI или тест.

+0

+1 для информации, так как это может помочь некоторым, но опять же, я пытаюсь сделать это просто и легко. Считайте это упражнением для обучения кодированию. Опять же, спасибо за хедз-ап на CSLA. – MarqueIV

+0

Огромная информация, но только одно: не сложно реализовать DI или сделать ваш бизнес-объект поддающимся проверке ... Вы можете ввести DI, переопределив по умолчанию DataPortalActivator и внедряя свой пользовательский DataPortalActivator ... Делая это, вы будете иметь больший контроль над созданием экземпляра бизнес-объекта, поэтому вы легко вводите зависимости. – Viru

+0

@Viru - Спасибо за подсказку. Мне придется исследовать этот подход. Вы знаете какую-либо документацию в Интернете, в которой есть образец? – NightOwl888