Il existe trois solutions possibles qui me viennent à l'esprit:
a) La dure: Est-ce everthing vous
Chaque classe qui est générée par subsonique est une classe partielle . Vous pouvez créer un nouveau fichier et ajouter vous-même les méthodes de propriétés pour la relation ForeignKey:
partial class Order
{
private OrderDetailCollection orderDetails;
public OrderDetailCollection OrderDetails
{
get
{
if (orderDetailCollection == null)
orderDetailCollection = new OrderDetailCollection()
.Where(OrderDetailCollection.Columns.OrderId, this.Id).Load();
return orderDetailCollection;
}
set
{
if (value != null)
{
foreach(OrderDetail orderDetail in value)
orderDetail.OrderId = this.Id;
}
orderDetailCollection = value;
}
}
}
public Class OrderDetail
{
private Order order;
public Order Order
{
get { return order ?? DB.Select().From<Order>()
.Where(Id).IsEqualTo(this.OrderId)
.ExecuteSingle<Order>(); }
set
{
this.OrderId = value == null ? 0 : value.Id;
this.Order = value;
}
}
}
Cela a été écrit depuis la mémoire et n'a pas été testé. Vous pouvez regarder le code généré ou les modèles comme il devrait être (SubSonic ajoute des eventhandlers pour les éléments ajoutés et supprimés pour gérer les mises à jour ParentId et maintenir une DeleteList pour une utilisation dans un droit BindingContext)
b) Le moyen le plus simple: Mettre en place une base de données pour la génération de code qui utilise des clés étrangères (je recommande cette solution) et laissez SubSonic générer les parties de clé étrangère pour vous. Ne touchez pas votre production db.
Lors de l'exécution SubSonic (au moins 2.x) ne repose sur aucune réelle clé étrangère à exister. Le schéma d'information est uniquement interrogé lors de la génération DAL.
c) La manière orientée objet: Écrivez votre propre DataProvider subsonique qui hérite de celui que vous utilisez au moment et remplacer la méthode
public override TableSchema.Table GetTableSchema(string tableName, TableType tableType)
{
TableSchema.Table tbl = base.GetTableSchema(tableName, tableType)
if (tableName == "Orders")
{
tbl.ForeignKeys = new TableSchema.ForeignKeyTableCollection();
tbl.Columns.GetColumn("Id").ForeignKeyTableName = "OrderDetails";
TableSchema.ForeignKeyTable fkTable = new TableSchema.ForeignKeyTable(this);
fkTable.ColumnName = "OrderId";
fkTable.TableName = "OrderDetails";
tbl.ForeignKeys.Add(fkTable);
}
else if (tableName == "SomethingElse)
{
....
}
}
Dans cette méthode GetTableSchema() toutes les données du schéma d'information est tirée à partir de la base de données et utilisé pour la mise en place d'une représentation en mémoire de votre db. Voici la source du MySqlInnoDbDataProvider: http://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/DataProviders/MySqlInnoDBDataProvider.cs
(Les fournisseurs de données MySql sont un excellent exemple parce que la valeur par défaut « MySqlDataProvider » ne génère pas de FK-Relations, même si elle est utilisée avec un InnoDB DB et la « MySqlInnoDbDataProvider » hérite de lui et remplace les pièces nécessaires.
Dans votre app.config/web.config vous pouvez définir la DataProvider pour la génération.
Ces suggestions sont pour SubSonic2 mais sont probablement applicables pour SubSonic3.