Лучший способ представить поле в объекте, которое исходит из и ID+Name из БД?

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

public class Car
{

    public int TypeId;
    public int BrandId;
    public int ModelId;
    public decimal Price;

    public string TypeName;
    public string BrandName;
    public string ModelName;

}

На мой взгляд, это делает структуру объекта «грязной». Каков наилучший способ загрузить это в более структурированные объекты, например:

public class Car
{
    public Definitions.CarTypes Type;
    public Definitions.CarBrand Brand;
    public Definitions.CarModel Model;
    public decimal Price;
}

Меня беспокоит то, как данные будут заполняться внутри объекта, когда запрос возвращается из базы данных. Является ли использование конструктора (thisCar.Brand = new CarBrand(reader["id"],reader["name"]); для каждого поля хорошим способом сделать это?


person DaniH    schedule 21.03.2011    source источник


Ответы (1)


Моя первая склонность - использовать Enums. Перечисления могут иметь различные базовые типы, но по умолчанию используется Int. Вы можете явно установить значение int для каждого элемента в Enum, что полезно для того, чтобы они соответствовали какому-то другому заранее определенному списку (например, кодам ошибок или, в вашем случае, уникальным идентификаторам элементов в вашей БД).

Ваш код, который анализирует ваш набор данных и создает ваши объекты «Car», может просто преобразовать эти идентификаторы строк базы данных в соответствующий Enum.

class Program
{
    static void Main(string[] args)
    {
        Car myCar = new Car();
        myCar.Brand = (CarBrand)1;
        myCar.Model = (CarModel)10;
        myCar.Type = (CarType)3;

        Console.WriteLine("You drive a {0} {1} {2}. Niiiice.", myCar.Brand, myCar.Model, myCar.Type);
        Console.ReadLine();

    }
}

public class Car
{
    public CarType Type {get; set;}
    public CarBrand Brand {get; set;}
    public CarModel Model {get; set;}
    public decimal Price {get; set;}
}


public enum CarBrand
{
    BMW = 1,
    Audi = 2,
    Ford = 5,
    Volkswagen = 23
}
public enum CarModel
{
    M3 = 10,
    R8 = 211,
    Mustang = 3,
    Passat = 4
}
public enum CarType
{
    Sedan = 3,
    Coupe = 10,
    Convertible = 21
}

Конечно, вы хотели бы выполнить некоторую проверку ошибок и т. Д. Один из недостатков Enums заключается в том, что вы зависите от требований к именованию полей C # и, возможно, style-cop, поэтому может иметь смысл иметь свойство или служебный метод. который переходит к строковому ресурсу (например, RESX) и возвращает «FriendlyBrandName» или что-то в этом роде.

person Bryan Thomas    schedule 21.03.2011
comment
Я считаю, что это решение будет применяться только в том случае, если имеется в виду генерация кода, поскольку перечисление не может быть заполнено во время выполнения. Это также сделает недействительной возможность наличия других полей, а не идентификатора/значения, не прибегая к классу поддержки. - person DaniH; 22.03.2011