Entity Framework 为导航属性添加新记录

3

我有两个实体,定义如下

public class Corporation
{
    public int Id{get;set;}
    public string Name{get;set;}
    public List<Location> Locations{get;set;} // All locations under this corp
}

public class Location
{
    public int Id{get;set;}
    public Corporation Corporation{get;set;} // Corporation is required in configuraion
}

当我尝试添加一个公司和一个位置时,会定义两个公司。一个是我的添加公司函数定义的(这很好),另一个是添加位置函数定义的(这是问题所在)。
添加位置函数如下:
public void AddLocation(int locationId)
{
     using (Context context = new Context())
     {
          Location location = new Location();
          location.Corporation = GetCorporationFromDb(corpId);

          context.Locations.Add(location); // This one adds another same Corporation to DB
          context.SaveChanges();
     }
}

我该如何避免这种情况?我必须在位置之前添加公司名称,因为在实现中,位置使用公司的数据库ID计算电子代码。

1个回答

7
如果您从与添加位置时使用的数据上下文不同的数据上下文中获取公司,则会发生这种情况。请尝试以下操作:
Context context = new Context();
Location location = new Location();
Corporation corporation = context.Corporations
    .Where(x => x.Id == corpId)
    .First();
location.Corporation = corporation;

context.Locations.Add(location);
context.SaveChanges();

这样,您可以使用相同的上下文来检索Corporation并添加Location

还可以将从另一个上下文加载的对象附加到新上下文中... - Rico Suter
这可能是问题的原因。我上班后会尝试你建议的方法。 - Mert Akcakaya
我想在一个单独的方法中添加位置信息。我应该将上下文作为参数传递给该函数并添加位置吗?将上下文传递给另一个方法会引起问题吗? - Mert Akcakaya
不应该这样做。当你开始做这种事情时,也要看看手动方法注入,它是依赖注入的一部分。理想情况下,你需要一个初始化DbContext并将其传递给AddLocationAddCorporation方法的方法。 - Jesse van Assen
使用相同的上下文没有解决问题。这可能是某种关系配置问题吗? - Mert Akcakaya
可能是因为我描述的方式是默认的EF行为。你手动定义了映射吗?当我手动定义映射时,我总是在两侧定义它们(所以Corporation.HasMany()Location.HasRequired()),我从来没有遇到你描述的问题。你也可以像@RicoSuter建议的那样将实体附加到上下文中,如此处所示,但我对该方法没有经验,所以无法给出建议。 - Jesse van Assen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接