【发布时间】:2013-06-22 19:12:49
【问题描述】:
我正在使用 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 为 null 但
((ConcretePerson)entityEntry.CurrentValues.ToObject()).QuantityId 是正确的(包含正确的值)
为什么?如何使用当前值(既不是原始值也不是数据库值)仅使用当前值来获得与 null 不同的值?
2.- 如果我通过执行concretePerson.Quantity 直接检查数量,它不是空的,而是
具体Person.Quantity 包含当前值(在第一次 foreach 中更新的值),
不是原始的(在第一个 foreach 中更新之前的值)。不应该是具体的Person.Quantity
包含原始值(在第一个 foreach 中更新之前)?因为我没有
在两个 foreach 循环之间执行任何 context.savechanges。
3.-Context.SaveChanges 没有保存对数据库所做的更改,也没有引发任何错误。
【问题讨论】:
标签: entity-framework