Does Entity Framework support circular references?

前端 未结 4 1980
感动是毒
感动是毒 2021-01-04 06:42

I have two entities in parent/child relationship. In addition, parent contains a reference to a \"main\" child, so the simplified model looks like this:

clas         


        
4条回答
  •  被撕碎了的回忆
    2021-01-04 06:50

    I had this exact issue. The apparent "Circular reference" is simply good database design. Having a flag on the child table like "IsMainChild" is bad design, the attribute "MainChild" is a property of the parent not the child, so an FK in the parent is appropriate.

    EF4.1 needs to figure out a way to handle these type of relationships natively and not force us to redesign our databases to accommodate deficiencies in the framework.

    Anyhow my workaround is to do it several steps (like you might when writing a stored procedure to do the same) the only wrinkle is to get round the change tracking on the context.

    Using context As New <>
    
      ' assuming the parent and child are already attached to the context but not added to the database yet
    
      ' get a reference to the MainChild but remove the FK to the parent
      Dim child As Child = parent.MainChild
      child.ParentID = Nothing
    
      ' key bit detach the child from the tracking context so we are free to update the parent
      ' we have to drop down to the ObjectContext API for that
      CType(context, IObjectContextAdapter).ObjectContext.Detach(child)
    
      ' clear the reference on the parent to the child
      parent.MainChildID = Nothing
    
      ' save the parent
      context.Parents.Add(parent)
      context.SaveChanges()
    
      ' assign the newly added parent id to the child
      child.ParentID = parent.ParentID
    
      ' save the new child
      context.Children.Add(child)
      context.SaveChanges()
    
      ' wire up the Fk on the parent and save again
      parent.MainChildID = child.ChildID
      context.SaveChanges()  
    
      ' we're done wasn't that easier with EF?
    
    End Using  
    

提交回复
热议问题