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
额外费用
招徕者额外费用
我尝试使用实体框架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”