我正在使用 EF 4.1 和延迟加载。我有以下实体:
public abstract class PersonBase
{
[Key(), Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
....
[ForeignKey("Quantity")]
public virtual int? QuantityId { get; set; }
public virtual Quantity Quantity { get; set; }
....
}
public class ConcretePerson : PersonBase
{
....
}
public class Quantity
{
[Key(), Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public virtual float QuantityA { get; set; }
[Required]
public virtual float QuantityB { get; set; }
[Required]
public virtual float QuantityC { get; set; }
}
IDbSet<Quantity> Quantities;
IDbSet<ConcretePerson> ConcretePersons;
IDbSet<PersonBase> Persons;
所以在我的代码中,我在下面执行:
using (DataBaseContext context = new DataBaseContext())
{
IQueryable<ConcretePerson> concretePersonCollection = context.ConcretePersons.Where(<condition>);
foreach (ConcretePerson concretePerson in concretePersonCollection)
{
...
concretePerson.Quantity.QuantityA = new_quantity_A;
concretePerson.Quantity.QuantityB = new_quantity_B;
concretePerson.Quantity.QuantityC = new_quantity_C;
...
}
...
DbEntityEntry<ConcretePerson> entityEntry;
Quantity quantity;
foreach (ConcretePerson concretePerson in concretePersonCollection)
{
entityEntry = context.Entry<ConcretePerson>(concretePerson);
if (entityEntry.State == System.Data.EntityState.Modified)
{
quantity = ((ConcretePerson)entityEntry.CurrentValues.ToObject()).Quantity;
}
else
{
quantity = concretePerson.Quantity;
}
...
}
...
context.SaveChanges();
}
请注意,我只在最后执行 SaveChanges,因此在达到这一点之前不会更新数据库。
我在第二个 foreach 中有问题:
1.- 当 entityEntry.State 被修改时,((ConcretePerson)entityEntry.CurrentValues.ToObject()).Quantity 为空,但 ((ConcretePerson)entityEntry.CurrentValues.ToObject())。 QuantityId 是正确的(包含正确的值) 为什么?如何使用当前值(既不是原始值也不是数据库值),只是当前值,使这与 null 不同?
2.- 如果我通过执行concretePerson.Quantity 直接检查Quantity,它不为null,但concretePerson.Quantity 包含当前值(在第一次foreach 中更新的值),而不是原始值(在第一次foreach 中更新之前的值) . concretePerson.Quantity 不应该包含原始值(在第一个 foreach 中更新之前)吗?因为我没有在两个 foreach 循环之间执行任何 context.savechanges 。
3.-Context.SaveChanges 没有保存对数据库所做的更改,也没有引发任何错误。<---- 这点解决了,我指的是不同的上下文,没有使用相同的(现在我使用的是相同的)。