在我的EF 6 MVC应用程序中,我有一个与SellerShippingPolicies有1:1关系的实体卖家。当我更新卖方实体时,EF也在尝试更新SellerShippingPolicies实体,我不希望这种情况发生。
我有以下更新卖方实体的方法:
public Entities.Seller Save(Entities.Seller seller)
{
// Instantiate a helper method
HelperMethods helper = new HelperMethods(this.UnitOfWork);
// Map the domain entity to an EF entity
var sellerRecord = Mapper.Map<Seller>(seller);
// Attempt to prevent the updating of the SellerShippingPolicies entity
helper.GetDbContext().Entry(sellerRecord.SellerShippingPolicies).State = EntityState.Detached;
// Save the entity
sellerRecord = helper.SaveItem<Seller>(sellerRecord);
}
以下是调用的SaveItem方法:
public T SaveItem(T entity)
{
var row = this._dbSet.Find(GetPrimaryKeyValue(entity));
if ( row == null )
return AddItem(entity);
else
return UpdateItem(entity);
}
最终被调用的Update方法:
public T UpdateItem(T entity)
{
// Retrieve the current copy of the entity to be updated.
var currentEntity = GetItem(GetPrimaryKeyValue(entity));
// Copy the contents of the modified entity on top of the copy we just retrieved. This way EF will save everything correctly.
currentEntity = Copy.ShallowCopy<T>(entity, currentEntity);
this._dbContext.SaveChanges();
return currentEntity;
}
不确定是否有必要,但这是ShallowCopy和GetItem的方法。
public static T ShallowCopy<T>(object source, T target)
{
foreach (PropertyInfo pi in typeof(T).GetProperties())
{
var property = source.GetType().GetProperty(pi.Name);
if (property == null)
continue;
if (property.GetSetMethod() != null)
property.SetValue(target, pi.GetValue(source, null), null);
}
return target;
}
public T GetItem(object primaryKeyValue)
{
return this._dbSet.Find(primaryKeyValue);
}
所有这些方法共享相同的上下文对象。
您可以看到我试图通过将其状态设置为已分离来阻止更新SellerShippingPolicies实体。这不起作用。我也尝试将状态设置为Unchanged。这也不起作用。在这两种情况下,EF都会尝试更新SellerShippingPolicies实体。我错过了什么?