我有一个单一位置表,其中包含多个外键关系。它具有状态表,城市表,国家表和用户表的外键。现在我在Entity框架中正确映射了表模型,但是如果我尝试访问Location表中的外键id字段以添加新的外键映射我无法访问它,而是我得到一个Reference字段,例如 StateReference
现在我发现一些文章说,只需使用entitykey.StateReference。我尝试了它并且它有效,但对我来说似乎很笨重。我注意到的是它也为我提供了一个字段State而不是StateID。因此,我假设一个人只能将状态名称传递给Location对象,实体框架几乎可以自动计算出这种关系。我无法在任何地方找到或找出适当的语法。
如果我离开基地,有人可以指出正确的方向并纠正我吗?我一直在冲击这一段时间,似乎无法得到它。或者,如果我所说的是正确的,有人可以给我一些基本代码来显示语法。我正在VS2010中制作一个Web服务,所以如果我理解正确的话,我正在使用ef v1。下面是我的位置对象的代码。
using(Entities context = new Entities())
{
Location NewLocation = new Location
{
//In SQL all three of these field are acutally foreign key ids I am
trying to maintian
State = context.States.Where(i => i.State1.Equals(AddedState)),
Country = context.Countries.Where(i => i.State1.Equals(AddedCountry)),
City = context.Cities.Where(i => i.City1.Equals(AddedCity)),
}
};
context.AddToLocation(NewLocation);
context.SaveChanges();
}
答案 0 :(得分:0)
正确的语法应该是:
using(Entities context = new Entities())
{
Location NewLocation = new Location
{
State = context.States.SingleOrDefault(s => s.ID == AddedState.ID),
Country = context.Countries.SingleOrDefault(c => c.ID == AddedCountry.ID),
City = context.Cities.SingleOrDefault(c => c.ID == AddedCity.ID)
};
context.AddToLocation(NewLocation);
context.SaveChanges();
}
(假设主键属性称为ID
)
正如Tod在您的问题下面的评论中所提到的,使用EF 4.0,您可以选择在从现有数据库模式创建/更新模型时将外键列公开为模型属性。在更新向导中有一个复选框“在模型中包含外键列”:
修改强>
如果AddedState
,AddedCountry
和AddedCity
是表示实体的Name
属性的字符串,则只需将ID
的查询替换为按Name
查询:
using(Entities context = new Entities())
{
Location NewLocation = new Location
{
State = context.States.SingleOrDefault(s => s.Name == AddedState),
Country = context.Countries.SingleOrDefault(c => c.Name == AddedCountry),
City = context.Cities.SingleOrDefault(c => c.Name == AddedCity)
};
context.AddToLocation(NewLocation);
context.SaveChanges();
}
请注意,SingleOrDefault
的使用假定Name
在数据库表中是唯一的。如果有两个或多个具有相同名称的记录SingleOrDefault
将抛出异常(“序列包含多个元素”)。您可以将SingleOrDefault
替换为FirstOrDefault
,然后只需加载具有给定名称的第一条记录。