1

我有一个包含多个外键关系的单一位置表。它具有状态表、城市表、国家表和用户表的外键。现在我在 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();
     }
4

1 回答 1

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

顺便说一句:使用 VS2010 并不一定意味着您使用的是 EF 版本 1。重要的是您的项目的 .NET Framework 目标平台:如果项目以 .NET 3.5 为目标,则您使用的是 EF 版本 1。如果项目以 .NET 4.0 为目标,您正在使用 EF 版本 4。(版本 2 和 3 不存在。)在 VS2010 中创建新项目时,默认目标平台是 .NET 4.0。因此,除非您将目标平台明确更改为 .NET 3.5(或将旧项目从 VS2008 迁移到 VS2010),否则您更有可能使用 EF 4.0。

正如 Tod 在您的问题下方的评论中所提到的,使用 EF 4.0,您可以选择在从现有数据库模式创建/更新模型时将外键列公开为模型属性。在更新向导中有一个复选框“在模型中包含外键列”:

更新向导

编辑

如果AddedState和是表示实体属性的字符串,则AddedCountry可以将查询替换为查询:AddedCityNameIDName

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为仅加载具有给定名称的第一条记录。

于 2012-08-15T23:29:43.633 回答