实体框架维护外键关系

时间:2012-08-15 17:23:10

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

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

1 个答案:

答案 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

BTW:使用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,您可以选择在从现有数据库模式创建/更新模型时将外键列公开为模型属性。在更新向导中有一个复选框“在模型中包含外键列”:

Update Wizard

修改

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