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