C# 将EF对象添加为外键

C# 将EF对象添加为外键,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,好吧,这几天我一直在为这件事发愁 如何指示entity framework将对象作为外键插入现有对象,而不是作为全新的对象?我试过各种各样的东西。我不断收到错误“ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象。” 我只是想在地址中添加一个国家。这些国家都列在单独的数据库表中。国家/地区来自MVC视图中发布的下拉列表,因此我只有ID。这意味着我获取对象的唯一方法是查询EF,这将导致重复的对象 希望有人能帮忙。啊 M =

好吧,这几天我一直在为这件事发愁

如何指示entity framework将对象作为外键插入现有对象,而不是作为全新的对象?我试过各种各样的东西。我不断收到错误“ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象。”

我只是想在地址中添加一个国家。这些国家都列在单独的数据库表中。国家/地区来自MVC视图中发布的下拉列表,因此我只有ID。这意味着我获取对象的唯一方法是查询EF,这将导致重复的对象

希望有人能帮忙。啊

M

==更多信息===

虽然上面指出只设置countryID是非常正确的,但这只适用于创建场景。它不适用于编辑

我的控制器中有:

    public ActionResult Edit(SiteViewModel siteViewModel)
    {
        if (ModelState.IsValid)
        {
            Site site = _unitOfWork.SiteRepository.GetById(siteViewModel.SiteID);
            _unitOfWork.Detach(site);
            site = Mapper.Map<SiteViewModel, Site>(siteViewModel);
            site.CountryId = siteViewModel.CountryId;
            ...
        }
    }
公共操作结果编辑(SiteViewModel SiteViewModel) { if(ModelState.IsValid) { Site Site=\u unitOfWork.SiteRepository.GetById(siteViewModel.SiteID); _工作单元。分离(现场); site=Mapper.Map(siteViewModel); site.CountryId=siteViewModel.CountryId; ... } } 我现在仍在获取具有相同键错误的多个对象。如何分离国家/地区,以便在不将其从数据库中删除的情况下重新添加它(!)

请帮忙

M

试试:

var id = 2; // id of item 

using (var context = new Context())
      {
            var item = context.YourTable.Single(m => m.Id== id);

            item.ForeinKey = someNewForeinKey;

            context.SubmitChanges();
      }

将国家/地区附加到地址的最便宜的方法是使用存根表示您随后附加到地址的国家/地区在这种情况下,您只想附加现有国家/地区而不进行编辑,这样可以避免往返数据库。

例如

正如Iain Galloway在评论中指出的那样,如果您的地址-->国家/地区关系也具有外键id属性,则您还可以实现以下相同功能:

address.CountryId = postedId;

当通过
SaveChanges
方法调用
DetectChanges
时,实体框架将执行关系修复,并确保所有导航属性设置正确。

使用ForeignKey属性。这样,您就可以指定一个id,而不是整个对象。只需在类中包含一个int属性,并使用表示int属性代表外键的属性装饰导航属性。

您可以发布
国家
地址
实体吗?值得一提的是,如果您的谢谢你的回答。请参阅上面的更多信息。
address.CountryId = postedId;