【问题标题】:Duplicate row in associated entity using entity frameworks with POCO entities使用具有 POCO 实体的实体框架在关联实体中重复行
【发布时间】:2012-08-28 01:35:20
【问题描述】:

我在使用 Entity-FrameworksPOCO 实体时遇到问题。我有产品和类别之间的关系,我有以下代码要保存在数据库中:

    public virtual void Add(T entity)
    {
        ContextEntity.AddObject(entity);
        Context.SaveChanges();
    }

我正在尝试使用已存在的类别创建一个新产品,但是当我查询数据库时,新产品与一个新类别的关系与我尝试关联的前一个类别具有相同的值。 我一直在寻找答案,但这些示例不适用于我,因为我没有他们在示例中使用的相同方法。可能是因为我使用的是POCO 实体,所以我不确定。

【问题讨论】:

标签: c# entity-framework poco entity-relationship


【解决方案1】:

我对您的代码做了一些假设,但也许其中一种方法会有所帮助。

  1. 创建新产品实例时,您可以设置外键 像 CategoryId 这样的值到现有的 Category Id

  2. 如果你想设置导航属性“Product.Category”你 必须确保以下几点:

引用的 Category 实例必须由上下文拥有,方法是使用 Context.Categories.Attach 或首先通过上下文获取它,例如Context.Categories.FirstOrDefault(c => c.id == 1)

如果您将 Product.Category 设置为 Category 的断开连接实例,上下文将自动尝试添加引用的实例。

【讨论】:

  • 我正在使用 context.Categories.FirstOrDefault(c => c.id == 1) 之类的东西获取 Category 的实例,但是框架无论如何都会插入一个新行。注意:我使用的是对对象的引用,没有 CategoryId 来填充关系
  • 您在添加产品时必须使用与检索类别相同的上下文实例。如果它是不同的上下文实例,则必须将类别附加到新上下文。如果您使用的是相同的上下文实例,那么您可以在这里发布更多代码以便我们检查它。
【解决方案2】:
    [HttpPost]
    public ActionResult Create(CategoriaView collection)
    {
        try
        {
            UnidadDeMedida unidadDeMedida= 
                unidadDeMedidaService.GetByCriteria(i => i.IdUnidadDeMedida == collection.UnidadDeMedida.IdUnidadDeMedida)
                .FirstOrDefault();
            Mapper.CreateMap<UnidadDeMedida,UnidadDeMedidaView>();
            Mapper.CreateMap<UnidadDeMedidaView,UnidadDeMedida>();
            UnidadDeMedidaView unidadDeMedidaView =
                Mapper.Map<UnidadDeMedida,UnidadDeMedidaView>(unidadDeMedida);
            collection.UnidadDeMedida = unidadDeMedidaView;
            Mapper.CreateMap<CategoriaView, Categoria>();

            Categoria categoria =
                Mapper.Map<CategoriaView, Categoria>(collection);
            categoria.UnidadDeMedida = unidadDeMedida;
            service.Add(categoria);

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

【讨论】:

  • 这是对您问题的回答还是补充?
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 2011-08-21
  • 2011-05-09
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多