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 を実行するだけなので、この時点に到達するまでデータベースは更新されないことに注意してください。

2 番目の foreach 内に問題が
あります。 QuantityId が正しい (正しい値が含まれている) なぜですか? これを現在の値 (元の値でもデータベース値でもない) で null とは異なるものにするにはどうすればよいですか?

2.-concretePerson.Quantity を実行して Quantity を直接チェックすると、null ではありませんが、concretePerson.Quantity には元の値 (最初の foreach で更新される前の値) ではなく、現在の値 (最初の foreach で更新された値) が含まれます。 . 代わりに、concretePerson.Quantity に元の値 (最初の foreach で更新する前) を含めるべきではありませんか? 2 つの foreach ループ間で context.savechanges を実行していないためです。
3.-Context.SaveChanges は、データベースに対して行われた変更を保存しておらず、エラーも発生していません。<---- この点は解決されました。私は別のコンテキストを指していましたが、同じものを使用していません (現在は同じものを使用しています)。

4

1 に答える 1