开发者

Insert record in child table when parent record already exists using Entity Framework code first

I have some Parent records already inserted in the database. Now i want to add some child records. To do this I followed following steps:

  1. Retrieve the Parent(A) records
  2. Create a new child(B) record
  3. Add parent record to the Navigation property of Child. B.A = A
  4. Call SaveChanges.

The problem is when i do this EF inserts a New Parent and then add the child with a foreign key pointing to new newly inserted parent instead of inserting just the child with mapping to already existing parent. I also checked the parent's primary key when saving the child and it does exists in the database.

Note that i am using database generated identity for Parent and Child. One thing i noticed开发者_开发技巧 was if I add/Save Parent and Child from the same context object then it works fine.

Need to fix this asap. Any help will be greatly appreciated.


Yes you must use the same context for that operation. That is the point. If you don't use the same context you must manually control which object will be inserted, which updated and which will not be modified. In your scenario the sequence can be:

context.Parents.Attach(parent); // just attach as unchanged
context.Childs.Add(child); // add as inserted
parent.Childs.Add(child); // make connection between existing and inserted object
context.SaveChanges();

Another approach can be:

child.Parent = parent;
context.Childs.Add(child); // both child and parent are marked as inserted!!!
context.Entry(parent).State = EntityState.Unchanged; // set parent as unchanged
context.SaveChanges();


Also, in the case when you have something like:

public class B
{
[Key]
public int Id {get;set;}

public AId {get;set;}

//... other properties here

[ForeignKey("AId")]
public virtual A ParentA {get;set;}
}

you could only set the foreign key to the existing A id entry in DB without and leave the ParentA null and on context.SaveChanges() it will work as expected (not creating another A entry in DB).


The below code worked for this situation.

networkDbo.Form.Id = forms.Id; // <-- AGAIN assigning FK  // Form is Parent Table 
this.dbContext.Form.Attach(formsdbo);  // Attach the parent value to db Context
this.dbContext.Network.Attach(networkDbo); // network is Child 
this.dbContext.Entry(networkDbo).State = EntityState.Added;  // Entity State is Added.
this.dbContext.SaveChanges();  // Save the Db context.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜