2016-04-13 1 views
3

J'ai écrit un DataSet personnalisé (basé sur un DataSet fortement typé, plus je vois) et je veux le rendre approprié pour être utilisé au moment du design, des choses comme être traînées depuis la ToolBox (généré automatiquement en tant qu'outil DataSet). Tout cela se passe parce que j'essaie de garder la méthodologie de développement, définie par mes collègues de travail (je suis le nouveau, hahaha), Bien sûr, je suis conscient de l'existence de Entity Framework et ce genre de choses. Donc, je reçois cette erreur lorsque je le place sur mon formulaire:.Net DataSet ne convient pas pour le design

Relation nommé « ParentChild_Relation » appartient déjà à ce DataSet

Bien sûr, il est une relation de la matière

C'est le code:

Public Class MyDataSet 
    Inherits DataSet 

    Public Const PARENTCHILD_RELATION As String = "ParentChild_Relation" 

    Public Sub New() 
     MyBase.New() 
     Me.BeginInit() 
     Me.CreateDataSet() 
     Me.EndInit() 
    End Sub 

    Private Sub CreateDataSet() 
     DataSetName = "Test" 
     Me.EnforceConstraints = True 
     Me.Tables.Add(New ParentTable) 'custom datatable 
     Me.Tables.Add(New ChildTable) 'custom datatable 

     CreateRelation() 
    End Sub 

    Private Sub CreateRelation() 
     With DirectCast(Me.Tables(ChildTable.TABLENAME).Constraints.Add(PARENTCHILD_RELATION , 
                   Me.Tables(ParentTable.TABLENAME).Columns(ParentTable.ID), 
                   Me.Tables(ChildTable.TABLENAME).Columns(ChildTable.ID)), ForeignKeyConstraint) 
      .UpdateRule = Rule.Cascade 
      .DeleteRule = Rule.Cascade 
      Me.Relations.Add(.ConstraintName, .RelatedColumns, .Columns, False) 
     End With 
    End Sub 

End Class 

Je serai au courant de toute l'aide possible

EDIT

Il fonctionne sans cette ligne:

Me.Relations.Add(.ConstraintName, .RelatedColumns, .Columns, False) 

Mais, je veux encore la relation DataSet parce que c'est la façon dont ils travaillent

EDIT 2

Sans la ligne précédente, elle ne trouve pas de relation à travers les liaisons:

BindingSource.DataSource = New MyDataSet 
BindingSource.DataMember = "ParentChild_Relation" 

Répondre

1

Je devais faire ceci: Implémenter l'événement DataSet.Initialized puis créer toutes les relations qu'il contient.

Public Class MyDataSet 
    Inherits DataSet 

    Public Const PARENTCHILD_RELATION As String = "ParentChild_Relation" 

    Public Sub New() 
     MyBase.New() 
     Me.CreateDataSet() 
     With DirectCast(Me.Tables(ChildTable.TABLENAME).Constraints.Add(PARENTCHILD_RELATION , 
                   Me.Tables(ParentTable.TABLENAME).Columns(ParentTable.ID), 
                   Me.Tables(ChildTable.TABLENAME).Columns(ChildTable.ID)), ForeignKeyConstraint) 
      .UpdateRule = Rule.Cascade 
      .DeleteRule = Rule.Cascade 
     End With 
     AddHandler Initialized, AddressOf InitializedHandler 
    End Sub   


    Private Sub InitializedHandler(sender As Object, e As EventArgs)    
     Relations.AddRange((From tb As DataTable In Tables 
         From fkc As ForeignKeyConstraint In tb.Constraints.OfType(Of ForeignKeyConstraint)() 
         Where Not Relations.Contains(fkc.ConstraintName) 
         Select New DataRelation(fkc.ConstraintName, fkc.RelatedColumns, fkc.Columns, False)).ToArray()) 
    End Sub 

    Private Sub CreateDataSet() 
     DataSetName = "Test" 
     Me.EnforceConstraints = True 
     Me.Tables.Add(New ParentTable) 'custom datatable 
     Me.Tables.Add(New ChildTable) 'custom datatable 
    End Sub 

End Class 

je pensais que ce serait utile pour quelqu'un d'autre