1

我正在使用 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 没有保存对数据库所做的更改,也没有引发任何错误。<---- 这点解决了,我指的是不同的上下文,没有使用相同的(现在我使用的是相同的)。

4

1 回答 1

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

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

在第一个 foreach 中,您实际上是在修改集合中的每个项目(即使它没有保存到数据库中但它仍在内存中,否则 EF 怎么知道要保存到数据库中的内容?)。

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

基本上 CurrentValue 是内存实体的值(如果您更改 CurrentValue 属性更改)。OriginalValue 是“通常是实体的属性值,就像上次从数据库中查询时一样”

  1. 没关系;p
于 2013-06-21T11:13:20.790 回答