Je génère les classes DataContext LINQ-to-SQL et entité pour une base de données. La base de données comporte plusieurs tables, dont deux sont [AccountMaster] et [AccountCodes]. Une relation de clé étrangère est définie entre eux, avec [AccountMaster] .AccountNumber étant référencé à partir de [AccountCodes]. L'ajout d'un fichier LINQ-to-SQL dans VS2008 et le fait de faire glisser ces tables dans la vue de conception DBML génère de manière appropriée une collection de AccountNotes dans la classe AccountMaster.Associations SQLCetal DataContext non générées
Pendant ce temps, l'utilisation de SQLMetal pour générer le DataContext ne produit aucune collection EntitySet.
sortie Concepteur:
[Table(Name="dbo.A01_AccountMaster")]
public partial class A01_AccountMaster //...
{
//...
private long _AccountNumber;
private EntitySet<A01aAccountNote> _A01aAccountNotes;
//...
}
sortie SQLMetal:
[Table(Name="dbo.A01_AccountMaster")]
[DataContract()]
public partial class A01_AccountMaster //...
{
//...
private long _AccountNumber;
//...
}
Je suivais le guide à
http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx
J'ai essayé d'abord générer le fichier DBML en utilisant SQLMetal , puis générer le fichier DataContext.cs à partir du DBML résultant:
sqlmetal.exe /server:srv /database:db /user:usr /password:pwd /sprocs /namespace:AccountContext /context:AccountContext /dbml:AccountContext.dbml /language:csharp /serialization:unidirectional
sqlmetal.exe /sprocs /namespace:AccountContext /context:AccountContext /code:AccountContext.cs /language:csharp /serialization:unidirectional AccountContext.dbml
Cela ne génère pas les associations. En fait, l'inspection des fichiers DBML de SQLMetal par rapport à la vue Concepteur:
Création DBML:
<Type Name="A01_AccountMaster">
<!-- ... -->
<Column Name="AccountNumber" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
<Association Name="A01_AccountMaster_A01aAccountNote" Member="A01aAccountNotes" ThisKey="AccountNumber" OtherKey="AccountNumber" Type="A01aAccountNote" />
<!-- ... -->
</Type>
SQLMetal DBML:
<Type Name="A01_AccountMaster">
<!-- ... -->
<Column Name="AccountNumber" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
<!-- ... -->
</Type>
Ainsi, l'association manque déjà à l'étape DBML .
Étant donné que la base de données contient des tonnes de tables/sprocs, il n'est pas pratique d'utiliser le concepteur pour régénérer les classes DataContext. Comment faire pour que SQLMetal génère des associations correctement?
EDIT:
Exécution SQLMetal sur la base de données entière, je réalise que certaines associations d'entités sont générées correctement. La clé étrangère sur AccountNotes est définie comme:
ALTER TABLE [dbo].[A01aAccountNotes] WITH CHECK ADD CONSTRAINT [FK_A01aAccountNotes_A01_AccountMaster] FOREIGN KEY([AccountNumber])
REFERENCES [dbo].[A01_AccountMaster] ([AccountNumber])
GO
ALTER TABLE [dbo].[A01aAccountNotes] CHECK CONSTRAINT [FK_A01aAccountNotes_A01_AccountMaster]
GO
EDIT2:
J'ai remarqué que les associations créées correctement sont celles qui ont une règle ON SUPPRIMER CASCADE/UPDATE. Est-il alors absurde de générer des associations qui n'ont pas cette règle strictement définie au niveau de la base de données?
Mon SQL Metal est également heureux maintenant :) – dioslaska
J'ai eu le même problème. FK était lié à un index unique et l'association n'était pas générée. J'ai dû abandonner l'index unique et ajouter une contrainte unique à la place. Maintenant ça marche. Merci d'avoir indiqué la direction. –