Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 实体框架中的多对多关系处理问题_Asp.net_Entity Framework - Fatal编程技术网

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

Asp.net 实体框架中的多对多关系处理问题,asp.net,entity-framework,Asp.net,Entity Framework,我有一张桌子 游客 旅游者身份证 2.姓名 额外费用 额外费用 描述 招徕者额外费用 游客\额外费用\ ID-主键 游客ID-外键 额外费用\u ID-外键 我尝试使用实体框架ent进行此sql查询 "Select Tourist.Name, Extra_Charges.Extra_Charge_Description, FROM Tourist LEFT JOIN TOURIST_EXTRA_CHARGES on Tourist.Tourist_ID = TOURIST_EXT

我有一张桌子

游客

  • 旅游者身份证

    2.姓名


  • 额外费用

  • 额外费用
  • 描述

  • 招徕者额外费用

  • 游客\额外费用\ ID-主键
  • 游客ID-外键
  • 额外费用\u ID-外键

  • 我尝试使用实体框架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的游客的名字(如果他没有额外的费用,则为活动),如果他确实有额外的费用,则为额外费用的描述

    由于我不熟悉实体框架,我尝试了以下方法

    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
    
    
                      }
    
    但当我键入tourism.tourism\u EXTRA\u CHARGES时,我无法访问EXTRA\u CHARGES表及其描述列


    编辑:

    我读到,要使用实体框架映射和多对多关系,我应该删除我的列旅游者\额外\费用\ ID,并创建合成主键。 但当我这么做的时候——并且做了新的edmx模型——我现在看不到我的旅游附加费表了。 无论我创建了多少次模型,这个表都没有出现在模型中

    我现在看不到我的旅游附加费表

    这是多对多关系中的链接表所期望的,您不需要将此表作为一个实体

    您的
    游客
    实体现在应该有一个集合
    额外费用
    ,您可以这样执行查询:

    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\u CHARGES.Select(e=>e.Description)
    从每个额外费用中提取描述,并返回一个新的字符串集合<代码>字符串。Join将集合中的所有描述合并在一起,并用逗号分隔它们。

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