2014-10-23 4 views
0

Как создать экземпляр объекта с навигационным свойством?Как создать экземпляр объекта с навигационным свойством?

В моем приложении я использую два класса для представления объекта Fruit и объекта Color, как определено ниже.

public class Fruit 
{ 
    public Fruit(int fruitId, string name, Color color) 
    { 
     FruitId = fruitId; 
     Name = name; 
     Color = color; 
    } 

    public int FruitId { get; set; } 
    public string Name { get; set; } 
    public Color Color { get; set; } 
} 

public class Color 
{ 
    public Color(int colorId, string name, List<Fruit> fruits) 
    { 
     ColorId = colorId; 
     Name = name; 
     Fruits = fruits; 
    } 

    public int ColorId { get; set; } 
    public string Name { get; set; } 
    public List<Fruit> Fruits { get; set; } 
} 

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

result = some_query_result_from_database... 
Fruit f = new Fruit(result["FruitId"], result["Name"], ???); 

Проблема:
Если я заменить ??? из приведенного выше кода со следующим:

new Color(some_colorId, some_colorName, some_list_of_fruits) 

Где я могу получить some_list_of_fruits?

Update # 1:

Плоды и цвет объектов сверху представляет собой таблицы из базы данных, для этого примера я назвал это то же самое, так что объект Fruit есть фрукты таблицы двойника из базы данных и так делает Цвет объекта:

Table definition: 
    +----------+ 
    | Fruit | 
    +----------+ 
    | FruitId | 
    | Name  | 
    | ColorId | 
    +----------+ 
     |∞ 
     | 
     |1 
    +----------+ 
    | Color | 
    +----------+ 
    | ColorId | 
    | Name  | 
    +----------+ 

    Table contents: 

    Fruits 
    +---------+--------+----------+ 
    | FruitId | Name | ColorId | 
    +---------+--------+----------+ 
    | 10  | Apple | 70  | 
    | 20  | Orange | 80  | 
    | 30  | Grapes | 90  | 
    +---------+--------+----------+ 

    Colors 
    +----------+--------+ 
    | ColorId | Name | 
    +----------+--------+ 
    | 70  | Red | 
    | 80  | Orange | 
    | 90  | Violet | 
    +----------+--------+ 

Update # 2:

я проглядел на комментарий SriramSakthivel, я понял, SriramSakthivel я s также спрашивает, как я получаю данные для своих объектов. Так вот оно.

Для моего объекта Fruit:

string cs = some_connection_string; 
MySqlConnection c = new MySqlConnection(cs); 
try 
{ 
    c.Open(); 
    string query = select_statement_to_get_fruits_from_db; 
    ...then after that, I use MySqlDataReader to loop through the result to create fruit objects 
} 

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

+0

Я могу» Посмотрите, как это ответственно, не понимая контекста, если «Цвет» нуждается в списке всех возможных Фруктов, вам нужно будет создать этот список перед созданием любого Fruit() или передать в пустой список и добавить к нему, когда были созданы все экземпляры Fruit. –

+2

Это круговой зависимый конструктор. Цвет нуждается в 'List ', Fruit нуждается в 'Color', и это никогда не закончится. Очень похоже на [проблема с куриным яйцом] (http://en.wikipedia.org/wiki/Chicken_or_the_egg). Не глядя на схему БД и то, как вы получаете данные, мы не можем много помочь. –

+0

"Свойства навигации"? –

ответ

1

У вас есть круговая зависимость, и вы не сможете построить полные объекты в конструкторе - вам придется заполнить хотя бы одну сторону круговой зависимости позже.

Один из вариантов заключается в создании коллекции «плодов» в то время как вы создаете их:

  • коллекции сборки всех цветов первых, но есть списки фруктов пустые (Dictionary по colorId, вероятно, что вы ищете).
  • При создании фруктов регистрации фруктов в списке Color о фруктах:

Пример:

public Fruit(int fruitId, string name, Color color) 
{ 
    FruitId = fruitId; 
    Name = name; 
    Color = color; 
    color.Fruits.Add(this); 
} 

Вы также можете создавать цвета по требованию при создании плоды:

public Fruit CreateFruit(int fruitId, string fruitName, int colorId) 
{ 
    if (!colorDictionary.ContainsKey(colorId)) 
    { 
     var name = ...// Somehow get color name for colorID 
     colorDictionary.Add(colorId, 
      new Color { ColorId = ColorId, Name = name, List = new List<Fruits>()}); 
    } 

    return new Fruit(fruitId, fruitName, colorDictionary[colorId]; 
} 
+0

спасибо, я попробую это сразу – devpro101

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