EF 4.1发出检索原始值和当前值的问题

时间:2013-06-21 09:06:03

标签: entity-framework

我正在使用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; ----这一点已经解决了,我指的是一个不同的背景,没有使用相同的(现在我使用相同的)。

1 个答案:

答案 0 :(得分:1)

  1. 这是尝试获取价值的一种奇怪方式......尝试this

  2. concretePerson.Quantity将是实体的local副本,因此它将为您分配给它的任何值。

  3. 在第一个foreach中,您实际上正在修改集合中的每个项目(即使它未保存到数据库中,但它仍然在内存中,否则EF将如何知道要保存到数据库中的内容?)。 / p>

    在第二个实际上,您正在检查相同的集合,以查看实体是否已被修改(它们具有),然后获取当前值。但是,数量的当前值将与.quantity相同,因为您已修改实体。如果您检查修改后的条目的原始值,您会看到它是不同的。

    基本上,CurrentValue是内存实体的值(如果更改属性CurrentValue更改)。 OriginalValue为"usually the entity's property values as they were when last queried from the database"

    1. 没关系; p