在M:M关系中映射弱实体

时间:2015-04-15 15:13:49

标签: c# sql ado.net

我有一个mapper函数:

public void Mapper(List<Item> items, List<List> lists, List<ListItem> listItems)
    {
        using (var command = Context.CreateCommand())
        {
            command.CommandText = @"SELECT ListItem.ListId, ListItem.ItemId, Item.ItemId AS ItemItemId, List.ListId AS ListListId 
                                        FROM Item INNER JOIN
                                        ListItem ON Item.ItemId = ListItem.ItemId INNER JOIN
                                        List ON ListItem.ListId = List.ListId";
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    int listid = (int)reader["ListId"];
                    int itemid = (int)reader["ItemId"];
                    int listlistid = (int)reader["ListId"];
                    int itemitemid = (int)reader["ItemItemId"];

                    foreach (var listitem in listItems)
                    {
                        foreach (var item in items)
                        {
                            if (item.ItemId == itemitemid && itemitemid == itemid)
                            {
                                listitem.Item = item;
                            }
                        }

                        foreach (var list in lists)
                        {
                            if (list.ListId == listlistid && listlistid == listid)
                            {
                                listitem.List = list;
                            }
                        }
                    }
                }
            }
        }
    }

我的目标是实体列表的3个参数,我从我的数据库中获取,但我需要映射&#34; List和Listitem&#34;之间的引用。和&#34; Item和ListItem&#34;。

我的问题是它似乎总是将引用映射到其表中的LAST Item和List,例如,如果我是其表中的最后一个列表是&#34; Fridge&#34;并且其表中的最后一项是&#34; Milk&#34;,所有列表项都将引用这些项目。

有人可以帮忙吗?请告诉我是否需要在评论中提供更多代码。 :)

编辑:ListItem实现

public class ListItem
{
public virtual int Amount
{
    get;
    set;
}

public virtual int Volume
{
    get;
    set;
}

public virtual string Unit
{
    get;
    set;
}

public virtual List List
{
    get;
    set;
}

public virtual Item Item
{
    get;
    set;
}

}

2 个答案:

答案 0 :(得分:1)

listItems的所有元素最终将Item分配给items中的最后一个元素,并将List分配给{{1}中的最后一个元素的原因}}因为lists中的每个元素(参见listItems)最终都被分配,无条件,对于数据库中的每个foreach(参见最外层{ {1}})。

为了更简单地解释,你拥有的代码就是这个伪代码的逻辑等价物。

ListItem

假设while中的3个元素和foreach (db_element in db) { foreach (list_element in list) { list_element.property = ...; } } 中的5个元素将有15个赋值(3 x 5 = 15),而不是您想要的3个。

相反,这是您可以实现匹配db

中相应元素的条件的方法
list

答案 1 :(得分:0)

在这里,我已经为您更改了代码,因此您可以通过添加条件来确切了解我的意思。

请注意我们正在执行continue的行。

public void Mapper(List<Item> items, List<List> lists, List<ListItem> listItems)
{
    using (var command = Context.CreateCommand())
    {
        command.CommandText = @"SELECT ListItem.ListId, ListItem.ItemId, Item.ItemId AS ItemItemId, List.ListId AS ListListId 
                                    FROM Item INNER JOIN
                                    ListItem ON Item.ItemId = ListItem.ItemId INNER JOIN
                                    List ON ListItem.ListId = List.ListId";
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                int listid = (int)reader["ListId"];
                int itemid = (int)reader["ItemId"];
                int listlistid = (int)reader["ListId"];
                int itemitemid = (int)reader["ItemItemId"];

                foreach (var listitem in listItems)
                {
                    // This is the condition you're missing.
                    if (listitem.ListId != listid &&
                        listitem.ItemId != itemid)
                    {
                        continue;
                    }

                    foreach (var item in items)
                    {
                        if (item.ItemId == itemitemid && itemitemid == itemid)
                        {
                            listitem.Item = item;
                        }
                    }

                    foreach (var list in lists)
                    {
                        if (list.ListId == listlistid && listlistid == listid)
                        {
                            listitem.List = list;
                        }
                    }
                }
            }
        }
    }
}