【问题标题】:The property 'InventoryItemID' is part of the object's key information and cannot be modified属性“InventoryItemID”是对象的关键信息的一部分,不能修改
【发布时间】:2014-11-09 09:13:31
【问题描述】:

我无法添加 InventoryItem 类型的新实例,因为 ChangeTracker 认为我修改了主键。但它是作为构造函数完成的。

另一方面,我可以毫无问题地添加项目。但是当我在创建 InventoryItemType(即 InventoryItem 的 NavigationProperty)后插入它时,它会失败。

我搜索、尝试、将 EF 从 5 更新到 6.1.1,但我放弃了……我需要你的帮助

        InventoryItemType iit = new InventoryItemType
        {
            InventoryFamilyID = 12,
            Name = checkInPackage.Name,
            Provider = shippingDestination.RelatedWarehouse.Name,
            Reference = "Paquete nº " + checkInPackage.CheckInPackageId
        };


        this.inventoryItemTypeRepository.InsertOrUpdate(iit);
        this.inventoryItemTypeRepository.Save();

        InventoryItem ii = new InventoryItem
        {
            WarehouseID = checkInPackage.WarehouseID,
            Price = 0,
            InventoryItemTypeID = iit.InventoryItemTypeID
        };


        this.inventoryItemRepository.InsertOrUpdate(ii); // th
        this.inventoryItemRepository.Save();

存储库有:

    public void InsertOrUpdate(InventoryItem inventoryitem)
    {
        if (inventoryitem.InventoryItemID == default(int)) {
            // New entity
            context.InventoryItems.Add(inventoryitem);
        } else {
            // Existing entity
            context.Entry(inventoryitem).State = EntityState.Modified;
        }
    }

已修复:

我对@9​​87654323@ 1 到InventoryItem n 的关系有一个不好的定义

在 InventoryItemType.cs 中进行此更改后,它可以正常运行:

    public InventoryItemType()
    {
        InventoryItems = new HashSet<InventoryItem>();
    }
    public virtual ICollection<InventoryItem> InventoryItems { get; set; } 

在业务逻辑方面

    iit.InventoryItems.Add(
            new InventoryItem
            {
                WarehouseID = checkInPackage.WarehouseID,
                Price = 0,
                InventoryItemType = iit
            }
    );

    this.inventoryItemTypeRepository.InsertOrUpdate(iit);
    this.inventoryItemTypeRepository.Save();

【问题讨论】:

  • InventoryItemTypeInventoryItem是什么关系? 1比1?
  • 关系是InventoryItemType 1 到InventoryItem n
  • 您是否尝试过调试插入或更新方法,看看它是否进入正确的状态?
  • 是的,我试过了。它进入正确的条件。事实上,ChanteTracker 在 DbSet.Add 方法上触发并识别实体inventoryitem,因为它已更改主键。但正如你在代码中看到的,我没有设置它。
  • 最后是我手上的一个错误。我没有正确反映这种关系。但是,我不明白为什么错误的关系定义会导致主键错误......

标签: c# entity-framework


【解决方案1】:

根据this descriptionthis one,而不是在InventoryItem实体中设置InventoryItemTypeID设置InventoryItemType,也许它可以工作。

InventoryItem ii = new InventoryItem
{
    WarehouseID = checkInPackage.WarehouseID,
    Price = 0,
    InventoryItemType = iit
};

【讨论】:

  • 我试过了,结果一样。我想可能是因为我没有在 InventoryItemType 类中设置private ICollection&lt;InventoryItem&gt;
  • 发布InventoryItemTypeInventoryItem的定义及其EF配置。
  • 已修复,正如我在问题中所写,
猜你喜欢
  • 1970-01-01
  • 2011-03-12
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多