【问题标题】:Entity Framework Maintaining Foreign Key Relationships实体框架维护外键关系
【发布时间】:2012-08-17 03:45:07
【问题描述】:

我有一个包含多个外键关系的单一位置表。它具有状态表、城市表、国家表和用户表的外键。现在我在 Entity 框架中正确映射了表模型,但是如果我尝试访问 Location 表中的外键 id 字段以添加新的外键映射,我无法访问它,而是得到一个 Reference 字段,例如 状态参考。

现在我发现一些文章说,只需使用 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();
     }

【问题讨论】:

  • 您需要在 SO 上阅读一些关于编辑器的信息(单击帮助,然后在问题编辑器中单击高级帮助)。不要在段落中使用前导空格,这会将它们变成代码块。我对其进行了编辑,但我的编辑需要一些时间才能通过审批流程。根据您的问题,我知道在 EF 4.x 中我能够设置一个选项,告诉它映射外键以及创建引用。我认为此选项在以前的版本中不可用,因此您还可以指定您正在使用的 EF 版本。

标签: c# entity-framework foreign-keys foreign-key-relationship


【解决方案1】:

正确的语法应该是:

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。因此,您更有可能使用 EF 4.0,除非您将目标平台明确更改为 .NET 3.5(或者已将旧项目从 VS2008 迁移到 VS2010)。

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

编辑

如果AddedStateAddedCountryAddedCity 是表示实体的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,然后只加载具有给定名称的第一条记录。

【讨论】:

  • 我想我没有关注,因为 AdditionalState 是要添加到数据库中的状态字符串。那么这是否意味着我必须去检索添加状态的 id,然后使用我的单一或默认值然后再次返回表并检索 id 以将其设置为我的 Location 表中的状态外键 id?如果我理解正确,那似乎超级多余。我想我想在这里解释一些东西,所以如果你能解释一下的话。我也使用 v 3.5 所以 EF 1。
  • @user1474882:不,您不需要加载 ID。您需要通过任何查询加载实体本身。这不需要是按 ID 查询,您可以只使用按名称查询。请参阅上面的编辑部分。
猜你喜欢
  • 2017-07-20
  • 2020-07-08
  • 1970-01-01
  • 2018-09-09
  • 2022-01-04
  • 2018-07-04
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多