【发布时间】: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;
}
}
已修复:
我对@987654323@ 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();
【问题讨论】:
-
InventoryItemType和InventoryItem是什么关系? 1比1? -
关系是
InventoryItemType1 到InventoryItemn -
您是否尝试过调试插入或更新方法,看看它是否进入正确的状态?
-
是的,我试过了。它进入正确的条件。事实上,ChanteTracker 在 DbSet.Add 方法上触发并识别实体
inventoryitem,因为它已更改主键。但正如你在代码中看到的,我没有设置它。 -
最后是我手上的一个错误。我没有正确反映这种关系。但是,我不明白为什么错误的关系定义会导致主键错误......
标签: c# entity-framework