如何使用导航属性创建对象的实例?

时间:2014-10-23 14:43:56

标签: c# object properties

如何使用导航属性创建对象的实例?

在我的应用程序中,我使用两个类来表示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; }  
}   

在创建Fruit或Color的实例时,我从数据库中获取数据非常简单,但问题是,我不知道如何填充Fruit或Color的数据&# 39;导航属性......

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

更新#1:

上面的Fruit和Color对象表示数据库中的表,对于此示例,我将其命名为相同,因此Fruit对象与数据库中的Fruit表对应,Color对象也是如此:

    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 |  
    +----------+--------+  

更新#2:

我忽略了SriramSakthivel的评论,我意识到SriramSakthivel也在问我如何获取我的对象的数据。所以这就是。

对于我的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
}  

对于我的Color对象,它与上述命令的步骤完全相同,只是在我的查询中,我用select语句替换它以从数据库中检索颜色数据。

1 个答案:

答案 0 :(得分:1)

你有循环依赖,你不能在构造函数中构造完整的对象 - 你以后必须至少填充循环依赖的一面。

一个选择是建立&#34;水果&#34;的集合。在你创建它们时:

  • 首先构建所有颜色的集合,但将水果列表清空(colorId Dictionary可能就是您要找的东西。)
  • 创建水果时,在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];
}