如何创建具有导航属性的对象实例

本文关键字:属性 导航 对象 实例 何创建 创建 | 更新日期: 2023-09-27 18:27:31

如何创建具有导航属性的对象实例?

在我的应用程序中,我使用两个类来表示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的导航属性的数据。。。

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的评论,我意识到SriramSakathivel也在问我如何获得对象的数据。就是这样。

对于我的水果对象:

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语句替换它以从数据库中检索颜色数据外,其他步骤与上面的命令相同。

如何创建具有导航属性的对象实例

您有循环依赖关系,您将无法在构造函数中构造完整的对象-您以后必须至少填充循环依赖关系的一侧。

一种选择是在创建"水果"时建立它们的集合:

  • 首先建立所有颜色的集合,但有空的水果列表(通过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];
}