2017-12-10 13 views
0

子オブジェクトのコレクションを持つ親オブジェクトがあります。 EF Code Firstを使用してこのデータをDBに保存します。 いくつかの奇妙な理由により、親オブジェクトは保存されますが、子オブジェクトは保存されません。ここで子オブジェクトがEntity Frameworkコードを使用してDBに保存されていません。

は私のコードです:

class Person 
{ 
     public Person() 
     { 
      Operations = new ICollection<Operation>(); 
     } 

    public int Id { get; set; } 

    public virtual ICollection<Operation> Operations { get; set; } 
} 


public class Operation 
{ 
    public int Id { get; set; } 

    public string Data { get; set; } 

    public int PersonId { get; set; } 

    public virtual Person Person{ get; set; } 
} 

ここであなたDAL UpdateMethodです:

public bool UpdatePerson entity) 
{ 

    //_context.Set<Person>().AddOrUpdate(entity); 
    var entityInDb = _context.Persons.Find(entity.Id); 

    _context.Entry(entityInDb).CurrentValues.SetValues(entity); 
    _context.Entry(entityInDb).State = EntityState.Modified; 

    return _context.SaveChanges() > 0; 
} 

そして、ここBLLです:

//Create a new person if it does not exist. If exists, add only the Operations: 

     //check if such the person exists in the DB 
     var person = Repository.Filter(p=>p.Id == Id) 
        .AsNoTracking().FirstOrDefault(); 


     //if not, create a new record 
     if(person == null) 
     { 
      personNew = new Person{ 
       ... 
      }; 
      bool res = Repository.Insert(personNew); 

      if (res) 
      { 
       //find newly created person 
       person = Repository.Filter(p => p.Id == ...) 
         .AsNoTracking().FirstOrDefault(); 
      } 
     } 

//Add Operations to the Person entity and Save them:  
     var op = obj.ToOperationModel(); 
     op.PersonId = person.Id; 
     person.Operations.Add(op); 

     var res2 = Repository.Update(person); 

エラー、親オブジェクト(人は)ありませんres2はtrueを返しますが、操作はDBに追加されません

+0

私はこの1つは、それを削除してみてください、問題になることができると思います: 'AsNoTracking()' – bnu

答えて

0

このような更新方法を変更します。

public bool UpdatePerson entity) 
{ 

    //_context.Set<Person>().AddOrUpdate(entity); 
    var entityInDb = _context.Persons.Include(x => x.Operations).FirstOrDefault(x => x.Id == entity.Id);//Add Include for navigation property 

    _context.Entry(entityInDb).CurrentValues.SetValues(entity); 
    _context.Entry(entityInDb).State = EntityState.Modified; 
    _context.Entry(entityInDb).Property(x => x.Operations).IsModified = true; // Add this line 
    return _context.SaveChanges() > 0; 
} 

エンティティ間の関係を確立するには、DataAnnotations属性またはFluent Apiを使用できます。 DataAnnotationsを使用して関係を関連付けるには、OperationPersonエンティティを次のように変更します。

public class Operation 
{ 
    public int Id { get; set; } 

    public string Data { get; set; } 

    [ForeignKey("Person")] // Add ForeignKey attribute 
    public int PersonId { get; set; } 

    public virtual Person Person{ get; set; } 
} 
public class Person 
{ 
    public Person() 
    { 
     Operations = new ICollection<Operation>(); 
    } 
    [Key] // Add key attribute 
    public int Id { get; set; } 

    public virtual ICollection<Operation> Operations { get; set; } 
} 
+0

あなたの提案は動作しません:型 '人のプロパティ「の操作は、」プリミティブまたは複雑なプロパティではありません。 –

+0

流暢なAPIで関係を作成しましたか? – lucky

+0

流暢なAPIの意味がわかりません。最初にDBにテーブルを作成して関係を設定した後、最初のコード・モデルを生成するためにEFを使用しました。モデルは正しい:子オブジェクトの集合を持つ親オブジェクトがある。そして、あなたが提案した操作は、コレクション全体ではなく、プリミティブ型で機能します。 –

関連する問題