实体框架中的多对多关系处理问题

时间:2013-09-24 17:13:28

标签: asp.net entity-framework

我有桌子

游客

  1. Tourist_ID

    2.Name


  2. Extra_Charges

    1. Extra_Charge_ID
    2. 描述

    3. Toutist_Extra_Charges

      1. Tourist_Extra_Charge_ID - 主键
      2. Tourist_ID - 外键
      3. Extra_Charge_ID - 外键

      4. 我尝试使用实体框架ent

        进行此sql查询
            "Select Tourist.Name, Extra_Charges.Extra_Charge_Description, FROM Tourist
        
        LEFT JOIN TOURIST_EXTRA_CHARGES on Tourist.Tourist_ID = TOURIST_EXTRA_CHARGES.Tourist_ID 
        LEFT Join EXTRA_CHARGES on TOURIST_EXTRA_CHARGES.Extra_Charge_ID = EXTRA_CHARGES.Extra_Charge_ID
        WHERE Tourist.Tourist_ID=86
        

        我想得到id = 86的旅游者的名字(如果他没有额外收费的事件)以及他是否有额外收费 - EXTRA_CHARGE的说明

        由于我是实体框架的新手,我尝试了以下

        foreach (var tourist in db2.Tourist.Include("TOURIST_EXTRA_CHARGES").Include("EXTRA_CHARGES").Where(x=>x.Tourist_ID==86))
                          {
                              lblproba.Text+="Name" + tourist.Name_kir+" Description" + tourist.TOURIST_EXTRA_CHARGES.//don't have access to extra_charges table
        
        
                          }
        

        但是当我输入tourist.TOURIST_EXTRA_CHARGES时,我无法访问extra_charges表及其描述列


        修改

        我读到要使用具有多对多关系的实体框架映射,我应该删除我的列TOURIST_EXTRA_CHARGE_ID并制作组合主键。 但当我这样做 - 并制作了新的edmx模型 - 我现在看不到我的Tourist_Extra_Charges表。 并且无论我创建模型多少次 - 这个表没有出现在模型中

2 个答案:

答案 0 :(得分:1)

  

我现在看不到我的Tourist_Extra_Charges表

这是多对多关系中链接表的预期,您不需要将此表作为实体。

您的Tourist实体现在应该有一个集合EXTRA_CHARGES,您可以这样执行查询:

var tourist = db2.Tourist
    .Include("EXTRA_CHARGES")
    .SingleOrDefault(t => t.Tourist_ID == 86);

if (tourist != null)
{
    lblproba.Text += "Name "
        + tourist.Name_kir
        + " Description "
        + string.Join(", ", tourist.EXTRA_CHARGES.Select(e => e.Description));
}

我已将foreach循环替换为SingleOrDefault,因为您正在查询只能有一个结果(或没有结果)的主键。 EXTRA_CHARGES.Select(e => e.Description)从每个额外费用中提取描述并返回一个新的字符串集合。 string.Join将所有这些描述汇总在一起,并用逗号分隔它们。

答案 1 :(得分:0)

您的数据库结构错误。如果需要使用many2many关系链接2个表,则必须再添加一个表,所谓的“桥”表包含来自其他2个表的2个PK。当你拥有它时,EF将自动将其解析为关系属性“many2many”