我正在使用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())。数量为空但是
((ConcretePerson)entityEntry.CurrentValues.ToObject())。QuantityId是正确的(包含正确的值)
为什么?如何使用当前值(既不是原始值也不是数据库值)使其与null不同,只是当前值?
2.-如果我通过执行concretePerson.Quantity直接检查数量,它不是空的但是
concretePerson.Quantity包含当前值(在第一个foreach中更新的值),
不是原始的(在第一个foreach中更新之前的值)。不应该具体.Person.Quantity
包含原始值(在第一个foreach中更新之前)代替?因为我没有
在两个foreach循环之间执行任何context.savechanges
3.-Context.SaveChanges没有保存对数据库所做的更改,也没有引发任何错误。 &lt; ----这一点已经解决了,我指的是一个不同的背景,没有使用相同的(现在我使用相同的)。
答案 0 :(得分:1)
这是尝试获取价值的一种奇怪方式......尝试this。
concretePerson.Quantity将是实体的local副本,因此它将为您分配给它的任何值。
在第一个foreach中,您实际上正在修改集合中的每个项目(即使它未保存到数据库中,但它仍然在内存中,否则EF将如何知道要保存到数据库中的内容?)。 / p>
在第二个实际上,您正在检查相同的集合,以查看实体是否已被修改(它们具有),然后获取当前值。但是,数量的当前值将与.quantity相同,因为您已修改实体。如果您检查修改后的条目的原始值,您会看到它是不同的。
基本上,CurrentValue是内存实体的值(如果更改属性CurrentValue更改)。 OriginalValue为"usually the entity's property values as they were when last queried from the database"