Лучшие практики для отображения имен объектов внешнего ключа в объектах c # - PullRequest
2 голосов
/ 02 декабря 2011

У меня есть метод с именем GetCustomer, который возвращает объект Customer.

Объект Customer представлен ниже.

Public class Customer
{
  public int Id { get; set;}
  public string Name { get; set;}

  public int CompanyId { get; set;}
}

Допустим, Клиент связан с Компанией, и я должен отобразить эту информацию о клиенте на экране. Теперь, когда я вызываю метод GetCustomer, я получаю только информацию о клиенте. На экране мне также нужно отобразить companyname, к которому принадлежит этот клиент.

Одним из простых способов сделать это было бы иметь свойство с именем CompanyName в объекте customer и заполнить его из метода слоя данных. Но я не уверен, что это лучшая практика. Если клиент также принадлежит к department, теперь мне нужно иметь DepartmentId и DeptName в качестве свойств. Идентификаторы являются обязательными, поскольку иногда мне нужно отправить идентификатор, чтобы получить полный объект Dept / Company.

Я не хочу иметь полные объекты для Department and Company в объекте Customer.

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

Как лучше всего справиться с этим. Мое главное намерение состоит в том, чтобы избежать (или более) дополнительного вызова базы данных.

Я НЕ использую Linq or Entity Framework, просто обычный ADO.NET.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2011

Что бы я сделал, чтобы сохранить структуру ОО на уровне ваших бизнес-объектов и изменить ваш DAL, чтобы он возвращал всю необходимую вам информацию за один прием в оба конца БД.

Например, у вас может быть хранимая процедура, которая возвращает два набора результатов: один для клиентов, а другой для компаний, на которые они ссылаются. Вы можете использовать параметры с табличным значением, чтобы передать SP список из одного или нескольких клиентов для поиска.

В зависимости от размера вашей БД и ваших требований к производительности, вы также можете прочитать все таблицы Customer и Company в память при запуске приложения, кэшировать результаты и управлять вставкой / обновлением / удалением этих данных.

0 голосов
/ 03 декабря 2011

Эта ситуация зависит от ваших целей:

1 - если вы хотите избежать дополнительных вызовов БД, вам нужно кодировать свой интерфейс через коммуникатор БД только с одним экземпляром, открывать его только один раз и очищать егочлены (адаптер, команда .. и т. д.) каждый раз после выполнения вызовов БД и закрытия соединения в конце передачи данных.

2 - для другой цели вашего вопроса, используйте ленивую загрузку.поместите только идентификаторы в вашу сущность и инициализируйте и используйте принадлежащую идентификатору сущность, если необходимо!

Например:

public class Customer
{
  public int Id { get; set;}
  public string Name { get; set;}

  public int CompanyId { get; set;}
}

public class Company
{
  public int CompanyId;
  //company fields
}

// .. on your business layer if you need to use Company data:
// examine your Customer instance as "customer"

Company userCompany = GetCompanyWithId(customer.CompanyId);

но, как вы не сомневаетесь в своих предположениях, данные, которые будут загружатьсяэто зависит от ваших потребностей.Думай просто.Если вам нужны только имена отделов и компаний, вы можете создать представление для своей БД и вызвать его в своем коде.Вы можете создать объект как CustomerWithFullData, и вы можете поместить Заказчика, Отдел и т. Д. В этот объект, и когда вам нужно будет показать полные данные, вы можете заполнить их с помощью DB View.Или не беспокойтесь о создании сущностей.Если вам не нужна сущность, вызовите DB View напрямую DataSet и свяжите таблицы.Таким образом, вы можете перенести работу по сбору данных в БД, и это то, что мы хотим сделать.

Как я уже говорил, думайте просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...