好吧,我有以下模型结构:我有一个类 -DatabaseEntity
这基本上是
public class DatabaseEntity
{
public int Id { get; set; }
}
所以每个实体(如产品、类别等)都会继承DatabaseEntity
并有Id
财产。我也有典型的EntityFramework
存储库类InsertOrUpdate
method:
private readonly DbContext _database;
public void InsertOrUpdate<TObject>(TObject entity) where TObject : DatabaseEntity
{
if(entity.Id == default(int))
{
// New entity
DbSet<TObject>().Add(entity);
}
else
{
// Existing entity
_database.Entry(entity).State = EntityState.Modified;
}
_database.SaveChanges();
}
然后我通过 eBay api 从 eBay 下载我必须添加到数据库的类别列表。基本上类别是:
public class EbayCategory : DatabaseEntity
{
// It has Id since it inherits DatabaseEntity
public string Name { get; set; }
// ... some other properties
}
但是,问题是,当我下载这些类别及其 Id 属性时,它们当然已经有了值。当我尝试将它们保存到数据库时,例如:
public void UpdateCategories(IEnumerable<EbayCategory> newCategories)
{
foreach (var newCategory in newCategories)
{
_repository.InsertOrUpdate(newCategory);
}
}
我面临一些问题...首先,entity.Id != default(int)
因为它具有价值,所以存储库尝试更新该实体,而不是添加,但它不在数据库或上下文中,因此它会引发以下异常:
System.Data.Entity.Infrastructure.DbUpdateConcurencyException
"Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries."
...因为它认为其他人删除了我正在尝试更新的实体。我怎样才能保存这个InsertOrUpdate逻辑,因为很多项目都基于它,并且能够添加项目(EbayCategories
)与主键(Id
)到数据库,然后像其他实体一样更新/删除它们而不丢弃EbayCategory.Id
value?