2008-11-19 9 views
0

J'ai créé deux tables:ParentRelations ne fonctionnent pas dans les DataSets générés?

Editeur

  • PK, PublisherID, int, non null, indentité +1
  • PublisherName, varchar (50), non null

Produit

  • PK, ProductId, int, non null, l'identité +1
  • ProductName, varchar (50), non null
  • PublisherID, int, non null

Ensuite, je crée une contrainte de clé étrangère FK__Product__Publisher entre ces tables connectant les PublisherId. De cette façon, je veux prendre en charge les produits qui ont un éditeur chaque fois que chaque éditeur peut avoir plusieurs produits. C'est aussi simple que ça.

Maintenant, j'ai créé un projet de console en C#, ajouté un jeu de données typé et deux TableAdapter. Un pointant vers Publisher un vers Product. DataSet-Designer ajoute automatiquement la relation en fonction de ce qu'elle obtient à partir de SQL Server.

Il génère également automatiquement des propriétés qui devraient me permettre d'accéder à l'éditeur à partir d'un produit sélectionné et de tous les produits d'un éditeur sélectionné.

Ceci est mon code de test:

ProductTableAdapter adapter = new ProductTableAdapter(); 

foreach (ProductRow product in adapter.GetData()) 
{ 
    Console.WriteLine(product.PublisherRow.PublisherName); 
} 

Cependant, cela ne fonctionne pas. Avec le code généré, la PublisherRow propriété ressemble à ceci:

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
public LanguageRow PublisherRow { 
    get { 
     return ((PublisherRow)(this.GetParentRow(this.Table.ParentRelations["FK_Product_Publisher"]))); 
    } 
    set { 
     this.SetParentRow(value, this.Table.ParentRelations["FK_Product_Publisher"]); 
    } 
} 

this.Table.ParentRelations ne contient pas la relation. Il est nul et son accès entraîne une exception NullReferenceException.

Qu'est-ce que je fais mal ici?

Répondre

2

Cela me semble un peu bizarre de répondre à mon propre message. C'est un peu comme me parler. Cependant, j'ai en quelque sorte trouvé une solution et puisque ce problème semble être assez commun, je l'affiche ici. Le simple fait d'utiliser TableAdapters pour obtenir les données ne récupérera pas les relations correctes de la base de données.L'initialisation des relations a lieu au sein de la classe d'ensemble de données (à savoir la méthode InitClass qui est appelée à partir des ensembles de données de l'c'tor):

public DbDataSet() { 
    this.BeginInit(); 
    this.InitClass(); 
    ... 
    this.EndInit(); 
} 

La méthode InitClass généré correspondant ressemble à ceci:

private void InitClass() { 
    ... 
    this.relationFK_Product_Publisher= new global::System.Data.DataRelation("FK_Product_Publisher", new global::System.Data.DataColumn[] { this.tableProduct.PublisherIdColumn}, new global::System.Data.DataColumn[] { this.tablePublisher.PublisherIdColumn}, false); 
    this.Relations.Add(this.relationFK_Product_Publisher); 
} 

C'est pourquoi vous devez instancier la classe d'ensemble de données lui-même et utiliser la méthode de remplissage pour remplir vos classes de table comme ceci:

DbDataSet ds = new DbDataSet();  

ProductTableAdapter productAdapter = new ProductTableAdapter();    
productAdapter.Fill(ds.Product); 

PublisherTableAdapter publisherAdapter = new PublisherTableAdapter(); 
publisherAdapter.Fill(ds.Publisher); 

foreach (ProductRow product in ds.Product) 
{     
    Console.WriteLine(product.PublisherRow.PublisherName); 
} 
+0

est-ce que quelqu'un sait une meilleure façon? – Mephisztoe

Questions connexes