我首先使用EF代碼來開發我的3層WinForm應用程序,我使用斷開的POCO
s作爲我的模型實體。我的所有實體都從BaseEntity
類繼承而來。查找對象圖中具有相同鍵的實體,以防止「ObjectStateManager中已存在具有相同鍵的對象」錯誤
我用斷開POCO
S,所以處理實體的State
在客戶端側,並且在ApplyChanges()
方法,附上我的實體圖形(例如,與它的Order
是OrderLines
和Products
)到我DbContext
然後SYNCH每個實體的State
與它的客戶端State
。
public class BaseEntity
{
int _dataBaseId = -1;
public virtual int DataBaseId // DataBaseId override in each entity to return it's key
{
get { return _dataBaseId; }
}
public States State { get; set; }
public enum States
{
Unchanged,
Added,
Modified,
Deleted
}
}
所以,當我要保存相關實體的圖形,我用下面的方法:
public static EntityState ConvertState(BaseEntity.States state)
{
switch (state)
{
case BaseEntity.States.Added:
return EntityState.Added;
case BaseEntity.States.Modified:
return EntityState.Modified;
case BaseEntity.States.Deleted:
return EntityState.Deleted;
default:
return EntityState.Unchanged;
}
}
public void ApplyChanges<TEntity>(TEntity root) where TEntity : BaseEntity
{
_dbContext.Set<TEntity>().Add(root);
foreach (var entry in _dbContext.ChangeTracker
.Entries<BaseEntity>())
{
BaseEntity stateInfo = entry.Entity;
entry.State = ConvertState(stateInfo.State);
}
}
但如果我的圖形中包含具有相同鍵2個或多個實體我給這個錯誤:
An object with the same key already exists in the ObjectStateManager...
我怎麼能檢測與相同的密鑰的實體在我的圖(root
),使他們獨特在我的ApplyChanges()
方法?
你如何「通過圖表」?爲什麼你的實體實現'INotifyPropertyChanged'? –
根對象是TEntities的圖形,我實現INotifyPropertyChanged可以將對象綁定到winUI。 – Masoud
@Masoud是否具有相同的「ID」值-1?也許你只需要正確地標記添加的項目而不是更新或像這樣簡單的事情。事實上,你有ID衝突不一定是一個EF的關注,這聽起來像你在EF以外做了很多東西。 –