我有桌子
游客
Tourist_ID
2.Name
Extra_Charges
Toutist_Extra_Charges
我尝试使用实体框架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表。 并且无论我创建模型多少次 - 这个表没有出现在模型中
答案 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”