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 を実行するだけなので、この時点に到達するまでデータベースは更新されないことに注意してください。
2 番目の foreach 内に問題が
あります。 QuantityId が正しい (正しい値が含まれている) なぜですか? これを現在の値 (元の値でもデータベース値でもない) で null とは異なるものにするにはどうすればよいですか?
2.-concretePerson.Quantity を実行して Quantity を直接チェックすると、null ではありませんが、concretePerson.Quantity には元の値 (最初の foreach で更新される前の値) ではなく、現在の値 (最初の foreach で更新された値) が含まれます。 . 代わりに、concretePerson.Quantity に元の値 (最初の foreach で更新する前) を含めるべきではありませんか? 2 つの foreach ループ間で context.savechanges を実行していないためです。
3.-Context.SaveChanges は、データベースに対して行われた変更を保存しておらず、エラーも発生していません。<---- この点は解決されました。私は別のコンテキストを指していましたが、同じものを使用していません (現在は同じものを使用しています)。