【发布时间】:2013-01-03 11:51:23
【问题描述】:
我首先使用 EF 代码来开发我的 3 层 WinForm 应用程序,我使用断开连接的POCOs 作为我的模型实体。我所有的实体都继承自 BaseEntity 类。
我使用了断开连接的POCOs,所以我在客户端处理实体的State,并在ApplyChanges() 方法中附加我的实体图(例如一个Order 与它的OrderLines 和Products)到我的DbContext,然后将每个实体的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
ID值 -1 是否相同?也许您只需要正确标记要添加的项目,而不是更新或其他简单的事情。您有 ID 冲突这一事实不一定是 EF 问题,听起来您在 EF 之外做了很多事情。 -
@AdamHouldsworth 我使用 Id 并在每个实体中覆盖它。例如,在 Order 类中,Id 返回 OrderId。
-
@Masoud 是的,但您是否在此 ID 字段中设置值?
标签: c# entity-framework ef-code-first poco dbcontext