2016-10-02 2 views
0

Предположим, у меня есть класс под названием Expense. Я могу добавить различные виды связанных с автомобилем расходов - расходы на танки, расходы на ремонт, билеты и т. Д. Некоторые свойства расходов одинаковы для всех типов, таких как стоимость, дата и т. Д., Но есть некоторые отличия. Например: когда я подпитывал свой автомобиль, я хочу сохранить информацию, как я полностью заполнил мой танк или нет. Однако, когда я сохраняю ремонт, я хочу сохранить другую информацию.Механизм гибких свойств

Проблема в том, как создать какой-то механизм flxible properties?

То, что я придумал, состоит в том, чтобы иметь две таблицы: expenses и expenses_properties. В таблице expenses я мог бы хранить все основные, общие данные и expenses_properties будет иметь следующую структуру:

| Id | PropertyName | PropertyValue | ExpenseId 
| 1 | IsFull  | "true"  |  1 
| 2 | Stuff  | "2016-10-02" |  1 

Проблема заключается в том, для PropertyValue колонка я должен был бы использовать определенный тип, как, например nvarchar. В этом случае я не смог бы правильно сортировать эти значения (например, по дате)? Или, может быть, я бы это сделал?

Я думаю, что должен быть лучший способ сделать это, используя подход Entity Framework Code First.

+0

Если вы знаете официальный термин для этого, * Значение атрибута сущности *, вы можете продолжить исследование. Я уверен, что это заставит вас думать дважды. –

+0

@Gert, большое спасибо! Исследования действительно заставили меня думать дважды! –

ответ

1

Я хотел бы создать свой класс/объектную модель первого (а не наоборот, т.е. , начиная с базы данных):

public abstract class ExpenseBase 
{ 
    public DateTime ExpenseDate { get; set; } 
    public double Cost { get; set; } 
} 

public class FuelExpense : ExpenseBase 
{ 
    public Boolean FilledUp { get; set; } 
} 

public class OtherExpense : ExpenseBase 
{ 
    public string SomeOtherProperty { get; set; } 
} 

Затем выберите inheritance mapping strategy. В этой ситуации я обычно перехожу с «Table per Concrete class» (TPC).

0

Если существуют разные виды расходов, тогда на самом деле имеет смысл иметь разные классы (т. Е. Разные таблицы). У вас может быть Expenses, где вы можете хранить общие данные, а затем TankExpense, где вы храните определенные «свойства» с помощью столбца ExpenseId, где может быть внешний ключ идентификаторов таблицы расходов. Если вам необходимо получить экземпляр счета вы будете просто получать при использовании EF и все связанные с этим расходы будут появляться:

if (myExpense.TankExpense.Length > 0) 
{ 
    var isFull = myExpense.TankExpense[0].Full; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^