Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF 4.1检索原始值和当前值的问题_Entity Framework - Fatal编程技术网

Entity framework EF 4.1检索原始值和当前值的问题

Entity framework EF 4.1检索原始值和当前值的问题,entity-framework,Entity Framework,我使用EF4.1和延迟加载。我有以下实体: public abstract class PersonBase { [Key(), Required] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } .... [ForeignKey("Quantity")] public virtual int? QuantityId { get; set; }

我使用EF4.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;
公共抽象类PersonBase
{
[键(),必需]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
....
[外键(“数量”)]
公共虚拟int?QuantityId{get;set;}
公共虚拟数量{get;set;}
....
}
公共类具体人员:PersonBase
{
....
}
公共类数量
{
[键(),必需]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
[必需]
公共虚拟浮点数量a{get;set;}
[必需]
公共虚拟浮点量化b{get;set;}
[必需]
公共虚拟浮点数量{get;set;}
}
设定数量;
IDB-个人;
指定人员;
因此,在我的代码中,我执行以下操作:

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();
}
使用(DataBaseContext=newdatabasecontext())
{
IQueryable-concretePersonCollection=context.ConcretePersons.Where();
foreach(Concrete Person集合中的Concrete Person Concrete Person)
{
...
concretePerson.Quantity.QuantityA=新的数量;
concretePerson.Quantity.QuantityB=新的数量;
concretePerson.Quantity.QuantityC=新的数量;
...
}
...
DbEntityEntry entityEntry;
数量;
foreach(Concrete Person集合中的Concrete Person Concrete Person)
{
entityEntry=context.Entry(具体人);
if(entityEntry.State==System.Data.EntityState.Modified)
{
数量=((ConcretePerson)entityEntry.CurrentValues.ToObject()).quantity;
}
其他的
{
数量=人。数量;
}
...
}   
...
SaveChanges();
}

请注意,我只在最后执行SaveChanges,所以在达到这一点之前不会更新数据库。

我在第二个foreach中遇到问题:
1.-修改entityEntry.State时,((ConcretePerson)entityEntry.CurrentValues.ToObject()).Quantity为null,但 ((ConcretePerson)entityEntry.CurrentValues.ToObject()).QuantityId正确(包含正确的值) 为什么?如何使用当前值(既不是原始值,也不是数据库值),仅使用当前值来获取与null不同的值?

2.-如果我直接由执行人员检查数量。数量不为空,但 数量包含当前值(在第一个foreach中更新的值), 不是原始值(在第一个foreach中更新之前的值)。不应该是一个人。数量 是否改为包含原始值(在第一个foreach中更新之前)?因为我没有 在两个foreach循环之间执行了任何context.savechanges。
3.-Context.SaveChanges不会保存对数据库所做的更改,也不会引发任何错误。
  • 这是一种奇怪的获取价值的方式。。。试试看

  • 数量将是实体的副本,因此它将具有您分配给它的任何值

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

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

    基本上,CurrentValue是内存中实体的值(如果更改属性CurrentValue changes)。原始值为

  • 无所谓;p
  • 这是一种奇怪的获取价值的方式。。。试试看

  • 数量将是实体的副本,因此它将具有您分配给它的任何值

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

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

    基本上,CurrentValue是内存中实体的值(如果更改属性CurrentValue changes)。原始值为

  • 无所谓;p

  • 对于第2点:当你说它将是本地副本时,我认为你指的是当前值,对吗?但为什么是当前的价值观?它不应该是原值吗?我并不理解这一点。你能给我解释一下吗?在到达foreach之前,不会执行查询。所以第一个foreach从数据库中检索当前数据,但第二个foreach在再次执行查询时,数据来自哪里?你说的是当前值,但为什么?数据库值不能为,因为没有提交任何savechanges,但为什么它们不是第二个foreach中的原始值?好的,谢谢,我现在明白了,但有一个小问题:正如您所说,OriginalValue是“通常是实体的属性值,就像上次从数据库查询时一样”,所以在我的第二个foreach中,在“foreach(concretePersonCollection中的ConcretePerson ConcretePerson)”中再次执行该查询,那么在命中foreach时从何处读取值?数据库还是在内存中?据我所知,第一个查询将从数据库中获取数据并将其存储在内存中。第二次查询时,它将针对内存中的集合进行查询。获得新/更新的唯一方法